51 #include <sys/sysmacros.h>
52 #include <sys/systeminfo.h>
53 #include <sys/utsname.h>
54 #include <sys/atomic.h>
55 #include <sys/spl.h>
56 #include <sys/archsystm.h>
57 #include <vm/seg_kmem.h>
58 #include <sys/ontrap.h>
59 #include <sys/fm/protocol.h>
60 #include <sys/ramdisk.h>
61 #include <sys/sunndi.h>
62 #include <sys/vmem.h>
63 #include <sys/pci_impl.h>
64 #if defined(__xpv)
65 #include <sys/hypervisor.h>
66 #endif
67 #include <sys/mach_intr.h>
68 #include <vm/hat_i86.h>
69 #include <sys/x86_archext.h>
70 #include <sys/avl.h>
71
72 /*
73 * DDI Boot Configuration
74 */
75
76 /*
77 * Platform drivers on this platform
78 */
79 char *platform_module_list[] = {
80 "acpippm",
81 "ppm",
82 (char *)0
83 };
84
85 /* pci bus resource maps */
86 struct pci_bus_resource *pci_bus_res;
87
88 size_t dma_max_copybuf_size = 0x101000; /* 1M + 4K */
89
90 uint64_t ramdisk_start, ramdisk_end;
1824 {
1825 int i = 0;
1826
1827 while (i < len - 1 && boot_str[i] != '\0') {
1828 kern_str[i] = boot_str[i];
1829 i++;
1830 }
1831
1832 kern_str[i] = 0; /* null terminate */
1833 if (boot_str[i] != '\0')
1834 cmn_err(CE_WARN,
1835 "boot property string is truncated to %s", kern_str);
1836 }
1837
1838 static void
1839 get_boot_properties(void)
1840 {
1841 extern char hw_provider[];
1842 dev_info_t *devi;
1843 char *name;
1844 int length;
1845 char property_name[50], property_val[50];
1846 void *bop_staging_area;
1847
1848 bop_staging_area = kmem_zalloc(MMU_PAGESIZE, KM_NOSLEEP);
1849
1850 /*
1851 * Import "root" properties from the boot.
1852 *
1853 * We do this by invoking BOP_NEXTPROP until the list
1854 * is completely copied in.
1855 */
1856
1857 devi = ddi_root_node();
1858 for (name = BOP_NEXTPROP(bootops, ""); /* get first */
1859 name; /* NULL => DONE */
1860 name = BOP_NEXTPROP(bootops, name)) { /* get next */
1861
1862 /* copy string to memory above kernelbase */
1863 copy_boot_str(name, property_name, 50);
1864
1865 /*
1866 * Skip vga properties. They will be picked up later
1867 * by get_vga_properties.
1868 */
1869 if (strcmp(property_name, "display-edif-block") == 0 ||
1870 strcmp(property_name, "display-edif-id") == 0) {
1871 continue;
1872 }
1873
1874 length = BOP_GETPROPLEN(bootops, property_name);
1875 if (length == 0)
1876 continue;
1877 if (length > MMU_PAGESIZE) {
1878 cmn_err(CE_NOTE,
1879 "boot property %s longer than 0x%x, ignored\n",
1880 property_name, MMU_PAGESIZE);
1881 continue;
1882 }
1883 BOP_GETPROP(bootops, property_name, bop_staging_area);
1884
1885 /*
1886 * special properties:
1887 * si-machine, si-hw-provider
1888 * goes to kernel data structures.
1889 * bios-boot-device and stdout
1890 * goes to hardware property list so it may show up
1891 * in the prtconf -vp output. This is needed by
1892 * Install/Upgrade. Once we fix install upgrade,
1893 * this can be taken out.
1894 */
1895 if (strcmp(name, "si-machine") == 0) {
1896 (void) strncpy(utsname.machine, bop_staging_area,
1897 SYS_NMLN);
1898 utsname.machine[SYS_NMLN - 1] = (char)NULL;
1899 } else if (strcmp(name, "si-hw-provider") == 0) {
1900 (void) strncpy(hw_provider, bop_staging_area, SYS_NMLN);
1901 hw_provider[SYS_NMLN - 1] = (char)NULL;
1902 } else if (strcmp(name, "bios-boot-device") == 0) {
1903 copy_boot_str(bop_staging_area, property_val, 50);
1904 (void) ndi_prop_update_string(DDI_DEV_T_NONE, devi,
1905 property_name, property_val);
1906 } else if (strcmp(name, "acpi-root-tab") == 0) {
1907 (void) ndi_prop_update_int64(DDI_DEV_T_NONE, devi,
1908 property_name, *((int64_t *)bop_staging_area));
1909 } else if (strcmp(name, "smbios-address") == 0) {
1910 (void) ndi_prop_update_int64(DDI_DEV_T_NONE, devi,
1911 property_name, *((int64_t *)bop_staging_area));
1912 } else if (strcmp(name, "efi-systab") == 0) {
1913 (void) ndi_prop_update_int64(DDI_DEV_T_NONE, devi,
1914 property_name, *((int64_t *)bop_staging_area));
1915 } else if (strcmp(name, "efi-systype") == 0) {
1916 copy_boot_str(bop_staging_area, property_val, 50);
1917 (void) ndi_prop_update_string(DDI_DEV_T_NONE, devi,
1918 property_name, property_val);
1919 } else if (strcmp(name, "stdout") == 0) {
1920 (void) ndi_prop_update_int(DDI_DEV_T_NONE, devi,
1921 property_name, *((int *)bop_staging_area));
1922 } else if (strcmp(name, "boot-args") == 0) {
1923 copy_boot_str(bop_staging_area, property_val, 50);
1924 (void) e_ddi_prop_update_string(DDI_DEV_T_NONE, devi,
1925 property_name, property_val);
1926 } else if (strcmp(name, "bootargs") == 0) {
1927 copy_boot_str(bop_staging_area, property_val, 50);
1928 (void) e_ddi_prop_update_string(DDI_DEV_T_NONE, devi,
1929 property_name, property_val);
1930 } else if (strcmp(name, "bootp-response") == 0) {
1931 (void) e_ddi_prop_update_byte_array(DDI_DEV_T_NONE,
1932 devi, property_name, bop_staging_area, length);
1933 } else if (strcmp(name, "ramdisk_start") == 0) {
1934 (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
1935 property_name, *((int64_t *)bop_staging_area));
1936 } else if (strcmp(name, "ramdisk_end") == 0) {
1937 (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
1938 property_name, *((int64_t *)bop_staging_area));
1939 } else if (strncmp(name, "module-addr-", 12) == 0) {
1940 (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
1941 property_name, *((int64_t *)bop_staging_area));
1942 } else if (strncmp(name, "module-size-", 12) == 0) {
1943 (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE, devi,
1944 property_name, *((int64_t *)bop_staging_area));
1945 } else {
1946 /* Property type unknown, use old prop interface */
1947 (void) e_ddi_prop_create(DDI_DEV_T_NONE, devi,
1948 DDI_PROP_CANSLEEP, property_name, bop_staging_area,
1949 length);
1950 }
1951 }
1952
1953 kmem_free(bop_staging_area, MMU_PAGESIZE);
1954 }
1955
1956 static void
1957 get_vga_properties(void)
1958 {
1959 dev_info_t *devi;
1960 major_t major;
1961 char *name;
1962 int length;
1963 char property_val[50];
1964 void *bop_staging_area;
1965
2001 * And you can set monitor type manually in kdmconfig
2002 * if you are really an old junky.
2003 */
2004 (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2005 devi, "display-type", "color");
2006 (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2007 devi, "video-adapter-type", "svga");
2008
2009 name = "display-edif-id";
2010 length = BOP_GETPROPLEN(bootops, name);
2011 if (length > 0 && length < MMU_PAGESIZE) {
2012 BOP_GETPROP(bootops, name, bop_staging_area);
2013 copy_boot_str(bop_staging_area, property_val, length);
2014 (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2015 devi, name, property_val);
2016 }
2017
2018 kmem_free(bop_staging_area, MMU_PAGESIZE);
2019 }
2020
2021
2022 /*
2023 * This is temporary, but absolutely necessary. If we are being
2024 * booted with a device tree created by the DevConf project's bootconf
2025 * program, then we have device information nodes that reflect
2026 * reality. At this point in time in the Solaris release schedule, the
2027 * kernel drivers aren't prepared for reality. They still depend on their
2028 * own ad-hoc interpretations of the properties created when their .conf
2029 * files were interpreted. These drivers use an "ignore-hardware-nodes"
2030 * property to prevent them from using the nodes passed up from the bootconf
2031 * device tree.
2032 *
2033 * Trying to assemble root file system drivers as we are booting from
2034 * devconf will fail if the kernel driver is basing its name_addr's on the
2035 * psuedo-node device info while the bootpath passed up from bootconf is using
2036 * reality-based name_addrs. We help the boot along in this case by
2037 * looking at the pre-bootconf bootpath and determining if we would have
2038 * successfully matched if that had been the bootpath we had chosen.
2039 *
2040 * Note that we only even perform this extra check if we've booted
2041 * using bootconf's 1275 compliant bootpath, this is the boot device, and
2553
2554 /* isa node */
2555 if (pseudo_isa) {
2556 ndi_devi_alloc_sleep(ddi_root_node(), "isa",
2557 (pnode_t)DEVI_SID_NODEID, &isa_dip);
2558 (void) ndi_prop_update_string(DDI_DEV_T_NONE, isa_dip,
2559 "device_type", "isa");
2560 (void) ndi_prop_update_string(DDI_DEV_T_NONE, isa_dip,
2561 "bus-type", "isa");
2562 (void) ndi_devi_bind_driver(isa_dip, 0);
2563 }
2564
2565 /*
2566 * Read in the properties from the boot.
2567 */
2568 get_boot_properties();
2569
2570 /* not framebuffer should be enumerated, if present */
2571 get_vga_properties();
2572
2573 /*
2574 * Check for administratively disabled drivers.
2575 */
2576 check_driver_disable();
2577
2578 #if !defined(__xpv)
2579 if (!post_fastreboot && BOP_GETPROPLEN(bootops, "efi-systab") < 0)
2580 startup_bios_disk();
2581 #endif
2582 /* do bus dependent probes. */
2583 impl_bus_initialprobe();
2584 }
2585
2586 dev_t
2587 getrootdev(void)
2588 {
2589 /*
2590 * Usually rootfs.bo_name is initialized by the
2591 * the bootpath property from bootenv.rc, but
2592 * defaults to "/ramdisk:a" otherwise.
|
51 #include <sys/sysmacros.h>
52 #include <sys/systeminfo.h>
53 #include <sys/utsname.h>
54 #include <sys/atomic.h>
55 #include <sys/spl.h>
56 #include <sys/archsystm.h>
57 #include <vm/seg_kmem.h>
58 #include <sys/ontrap.h>
59 #include <sys/fm/protocol.h>
60 #include <sys/ramdisk.h>
61 #include <sys/sunndi.h>
62 #include <sys/vmem.h>
63 #include <sys/pci_impl.h>
64 #if defined(__xpv)
65 #include <sys/hypervisor.h>
66 #endif
67 #include <sys/mach_intr.h>
68 #include <vm/hat_i86.h>
69 #include <sys/x86_archext.h>
70 #include <sys/avl.h>
71 #include <sys/font.h>
72
73 /*
74 * DDI Boot Configuration
75 */
76
77 /*
78 * Platform drivers on this platform
79 */
80 char *platform_module_list[] = {
81 "acpippm",
82 "ppm",
83 (char *)0
84 };
85
86 /* pci bus resource maps */
87 struct pci_bus_resource *pci_bus_res;
88
89 size_t dma_max_copybuf_size = 0x101000; /* 1M + 4K */
90
91 uint64_t ramdisk_start, ramdisk_end;
1825 {
1826 int i = 0;
1827
1828 while (i < len - 1 && boot_str[i] != '\0') {
1829 kern_str[i] = boot_str[i];
1830 i++;
1831 }
1832
1833 kern_str[i] = 0; /* null terminate */
1834 if (boot_str[i] != '\0')
1835 cmn_err(CE_WARN,
1836 "boot property string is truncated to %s", kern_str);
1837 }
1838
1839 static void
1840 get_boot_properties(void)
1841 {
1842 extern char hw_provider[];
1843 dev_info_t *devi;
1844 char *name;
1845 int length, flags;
1846 char property_name[50], property_val[50];
1847 void *bop_staging_area;
1848
1849 bop_staging_area = kmem_zalloc(MMU_PAGESIZE, KM_NOSLEEP);
1850
1851 /*
1852 * Import "root" properties from the boot.
1853 *
1854 * We do this by invoking BOP_NEXTPROP until the list
1855 * is completely copied in.
1856 */
1857
1858 devi = ddi_root_node();
1859 for (name = BOP_NEXTPROP(bootops, ""); /* get first */
1860 name; /* NULL => DONE */
1861 name = BOP_NEXTPROP(bootops, name)) { /* get next */
1862
1863 /* copy string to memory above kernelbase */
1864 copy_boot_str(name, property_name, 50);
1865
1866 /*
1867 * Skip vga properties. They will be picked up later
1868 * by get_vga_properties.
1869 */
1870 if (strcmp(property_name, "display-edif-block") == 0 ||
1871 strcmp(property_name, "display-edif-id") == 0) {
1872 continue;
1873 }
1874
1875 length = BOP_GETPROPLEN(bootops, property_name);
1876 if (length < 0)
1877 continue;
1878 if (length > MMU_PAGESIZE) {
1879 cmn_err(CE_NOTE,
1880 "boot property %s longer than 0x%x, ignored\n",
1881 property_name, MMU_PAGESIZE);
1882 continue;
1883 }
1884 BOP_GETPROP(bootops, property_name, bop_staging_area);
1885 flags = do_bsys_getproptype(bootops, property_name);
1886
1887 /*
1888 * special properties:
1889 * si-machine, si-hw-provider
1890 * goes to kernel data structures.
1891 * bios-boot-device and stdout
1892 * goes to hardware property list so it may show up
1893 * in the prtconf -vp output. This is needed by
1894 * Install/Upgrade. Once we fix install upgrade,
1895 * this can be taken out.
1896 */
1897 if (strcmp(name, "si-machine") == 0) {
1898 (void) strncpy(utsname.machine, bop_staging_area,
1899 SYS_NMLN);
1900 utsname.machine[SYS_NMLN - 1] = '\0';
1901 continue;
1902 }
1903 if (strcmp(name, "si-hw-provider") == 0) {
1904 (void) strncpy(hw_provider, bop_staging_area, SYS_NMLN);
1905 hw_provider[SYS_NMLN - 1] = '\0';
1906 continue;
1907 }
1908 if (strcmp(name, "bios-boot-device") == 0) {
1909 copy_boot_str(bop_staging_area, property_val, 50);
1910 (void) ndi_prop_update_string(DDI_DEV_T_NONE, devi,
1911 property_name, property_val);
1912 continue;
1913 }
1914 if (strcmp(name, "stdout") == 0) {
1915 (void) ndi_prop_update_int(DDI_DEV_T_NONE, devi,
1916 property_name, *((int *)bop_staging_area));
1917 continue;
1918 }
1919
1920 /* Boolean property */
1921 if (length == 0) {
1922 (void) e_ddi_prop_create(DDI_DEV_T_NONE, devi,
1923 DDI_PROP_CANSLEEP, property_name, NULL, 0);
1924 continue;
1925 }
1926
1927 /* Now anything else based on type. */
1928 switch (flags) {
1929 case DDI_PROP_TYPE_INT:
1930 if (length == sizeof (int)) {
1931 (void) e_ddi_prop_update_int(DDI_DEV_T_NONE,
1932 devi, property_name,
1933 *((int *)bop_staging_area));
1934 } else {
1935 (void) e_ddi_prop_update_int_array(
1936 DDI_DEV_T_NONE, devi, property_name,
1937 bop_staging_area, length / sizeof (int));
1938 }
1939 break;
1940 case DDI_PROP_TYPE_STRING:
1941 (void) e_ddi_prop_update_string(DDI_DEV_T_NONE, devi,
1942 property_name, bop_staging_area);
1943 break;
1944 case DDI_PROP_TYPE_BYTE:
1945 (void) e_ddi_prop_update_byte_array(DDI_DEV_T_NONE,
1946 devi, property_name, bop_staging_area, length);
1947 break;
1948 case DDI_PROP_TYPE_INT64:
1949 if (length == sizeof (uint64_t)) {
1950 (void) e_ddi_prop_update_int64(DDI_DEV_T_NONE,
1951 devi, property_name,
1952 *((uint64_t *)bop_staging_area));
1953 } else {
1954 (void) e_ddi_prop_update_int64_array(
1955 DDI_DEV_T_NONE, devi, property_name,
1956 bop_staging_area,
1957 length / sizeof (uint64_t));
1958 }
1959 break;
1960 default:
1961 /* Property type unknown, use old prop interface */
1962 (void) e_ddi_prop_create(DDI_DEV_T_NONE, devi,
1963 DDI_PROP_CANSLEEP, property_name, bop_staging_area,
1964 length);
1965 }
1966 }
1967
1968 kmem_free(bop_staging_area, MMU_PAGESIZE);
1969 }
1970
1971 static void
1972 get_vga_properties(void)
1973 {
1974 dev_info_t *devi;
1975 major_t major;
1976 char *name;
1977 int length;
1978 char property_val[50];
1979 void *bop_staging_area;
1980
2016 * And you can set monitor type manually in kdmconfig
2017 * if you are really an old junky.
2018 */
2019 (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2020 devi, "display-type", "color");
2021 (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2022 devi, "video-adapter-type", "svga");
2023
2024 name = "display-edif-id";
2025 length = BOP_GETPROPLEN(bootops, name);
2026 if (length > 0 && length < MMU_PAGESIZE) {
2027 BOP_GETPROP(bootops, name, bop_staging_area);
2028 copy_boot_str(bop_staging_area, property_val, length);
2029 (void) ndi_prop_update_string(DDI_DEV_T_NONE,
2030 devi, name, property_val);
2031 }
2032
2033 kmem_free(bop_staging_area, MMU_PAGESIZE);
2034 }
2035
2036 /*
2037 * Copy console font to kernel memory. The temporary font setup
2038 * to use font module was done in early console setup, using low
2039 * memory and data from font module. Now we need to allocate
2040 * kernel memory and copy data over, so the low memory can be freed.
2041 * We can have at most one entry in font list from early boot.
2042 */
2043 static void
2044 get_console_font(void)
2045 {
2046 struct fontlist *fp, *fl;
2047 bitmap_data_t *bd;
2048 struct font *fd, *tmp;
2049 int i;
2050
2051 if (STAILQ_EMPTY(&fonts))
2052 return;
2053
2054 fl = STAILQ_FIRST(&fonts);
2055 STAILQ_REMOVE_HEAD(&fonts, font_next);
2056 fp = kmem_zalloc(sizeof (*fp), KM_SLEEP);
2057 bd = kmem_zalloc(sizeof (*bd), KM_SLEEP);
2058 fd = kmem_zalloc(sizeof (*fd), KM_SLEEP);
2059
2060 fp->font_name = NULL;
2061 fp->font_flags = FONT_BOOT;
2062 fp->font_data = bd;
2063
2064 bd->width = fl->font_data->width;
2065 bd->height = fl->font_data->height;
2066 bd->uncompressed_size = fl->font_data->uncompressed_size;
2067 bd->font = fd;
2068
2069 tmp = fl->font_data->font;
2070 fd->vf_width = tmp->vf_width;
2071 fd->vf_height = tmp->vf_height;
2072 for (i = 0; i < VFNT_MAPS; i++) {
2073 if (tmp->vf_map_count[i] == 0)
2074 continue;
2075 fd->vf_map_count[i] = tmp->vf_map_count[i];
2076 fd->vf_map[i] = kmem_alloc(fd->vf_map_count[i] *
2077 sizeof (*fd->vf_map[i]), KM_SLEEP);
2078 bcopy(tmp->vf_map[i], fd->vf_map[i], fd->vf_map_count[i] *
2079 sizeof (*fd->vf_map[i]));
2080 }
2081 fd->vf_bytes = kmem_alloc(bd->uncompressed_size, KM_SLEEP);
2082 bcopy(tmp->vf_bytes, fd->vf_bytes, bd->uncompressed_size);
2083 STAILQ_INSERT_HEAD(&fonts, fp, font_next);
2084 }
2085
2086 /*
2087 * This is temporary, but absolutely necessary. If we are being
2088 * booted with a device tree created by the DevConf project's bootconf
2089 * program, then we have device information nodes that reflect
2090 * reality. At this point in time in the Solaris release schedule, the
2091 * kernel drivers aren't prepared for reality. They still depend on their
2092 * own ad-hoc interpretations of the properties created when their .conf
2093 * files were interpreted. These drivers use an "ignore-hardware-nodes"
2094 * property to prevent them from using the nodes passed up from the bootconf
2095 * device tree.
2096 *
2097 * Trying to assemble root file system drivers as we are booting from
2098 * devconf will fail if the kernel driver is basing its name_addr's on the
2099 * psuedo-node device info while the bootpath passed up from bootconf is using
2100 * reality-based name_addrs. We help the boot along in this case by
2101 * looking at the pre-bootconf bootpath and determining if we would have
2102 * successfully matched if that had been the bootpath we had chosen.
2103 *
2104 * Note that we only even perform this extra check if we've booted
2105 * using bootconf's 1275 compliant bootpath, this is the boot device, and
2617
2618 /* isa node */
2619 if (pseudo_isa) {
2620 ndi_devi_alloc_sleep(ddi_root_node(), "isa",
2621 (pnode_t)DEVI_SID_NODEID, &isa_dip);
2622 (void) ndi_prop_update_string(DDI_DEV_T_NONE, isa_dip,
2623 "device_type", "isa");
2624 (void) ndi_prop_update_string(DDI_DEV_T_NONE, isa_dip,
2625 "bus-type", "isa");
2626 (void) ndi_devi_bind_driver(isa_dip, 0);
2627 }
2628
2629 /*
2630 * Read in the properties from the boot.
2631 */
2632 get_boot_properties();
2633
2634 /* not framebuffer should be enumerated, if present */
2635 get_vga_properties();
2636
2637 /* Copy console font if provided by boot. */
2638 get_console_font();
2639
2640 /*
2641 * Check for administratively disabled drivers.
2642 */
2643 check_driver_disable();
2644
2645 #if !defined(__xpv)
2646 if (!post_fastreboot && BOP_GETPROPLEN(bootops, "efi-systab") < 0)
2647 startup_bios_disk();
2648 #endif
2649 /* do bus dependent probes. */
2650 impl_bus_initialprobe();
2651 }
2652
2653 dev_t
2654 getrootdev(void)
2655 {
2656 /*
2657 * Usually rootfs.bo_name is initialized by the
2658 * the bootpath property from bootenv.rc, but
2659 * defaults to "/ramdisk:a" otherwise.
|