Lines Matching +full:mpc5200b +full:- +full:i2c
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Copyright (C) 1996-2005 Paul Mackerras.
44 #include <asm/asm-prototypes.h>
45 #include <asm/ultravisor-api.h>
70 * On ppc32 we compile with -mrelocatable, which means that references
81 * arguments to call_prom should be 32-bit values.
220 * Error results ... some OF calls will return "-1" on error, some
226 #define PROM_ERROR (-1u)
240 return c1 < c2 ? -1 : 1; in prom_strcmp()
253 return -E2BIG; in prom_strscpy_pad()
264 i--; in prom_strscpy_pad()
265 rc = -E2BIG; in prom_strscpy_pad()
282 return c1 < c2 ? -1 : 1; in prom_strncmp()
285 count--; in prom_strncmp()
296 return sc - s; in prom_strlen()
304 for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--) in prom_memcmp()
305 if ((res = *su1 - *su2) != 0) in prom_memcmp()
319 l1--; in prom_strstr()
338 count -= dsize; in prom_strlcat()
340 len = count-1; in prom_strlcat()
351 return -EINVAL; in prom_strtobool()
383 return -EINVAL; in prom_strtobool()
439 rets[i-1] = be32_to_cpu(args.args[nargs+i]); in call_prom_ret()
456 call_prom("write", 3, 1, prom.stdout, p, q - p); in prom_print()
474 for (i = nibbles-1; i >= 0; i--) { in prom_print_hex()
477 buf[i] += ('a'-'0'-10); in prom_print_hex()
491 for (i = UL_DIGITS-1; i >= 0; i--) { in prom_print_dec()
498 size = UL_DIGITS - i; in prom_print_dec()
516 call_prom("write", 3, 1, prom.stdout, p, q - p); in prom_printf()
585 prom_print("-"); in prom_printf()
586 vs = -vs; in prom_printf()
608 ret = call_prom_ret("call-method", 5, 2, &result, in prom_claim()
611 if (ret != 0 || result == -1) in prom_claim()
612 return -1; in prom_claim()
613 ret = call_prom_ret("call-method", 5, 2, &result, in prom_claim()
617 call_prom("call-method", 4, 1, ADDR("release"), in prom_claim()
619 return -1; in prom_claim()
622 call_prom("call-method", 6, 1, in prom_claim()
634 * it also causes some sort of double-fault on early pmacs */ in prom_panic()
694 --i; in tohex()
729 #define prom_toupper(c) (prom_islower(c) ? ((c) - 'a' + 'A') : (c))
745 (value = prom_isdigit(*cp) ? *cp - '0' : prom_toupper(*cp) - 'A' + 10) < base) { in prom_strtoul()
798 l = prom_getprop(prom.chosen, "bootargs", p, COMMAND_LINE_SIZE-1); in early_cmdline_parse()
865 opt += sizeof("svm=") - 1; in early_cmdline_parse()
875 * followed by # option vectors - 1, followed by the option vectors.
881 /* Firmware expects the value to be n - 1, where n is the # of vectors */
882 #define NUM_VECTORS(n) ((n) - 1)
885 * Firmware expects 1 + n - 2, where n is the length of the option vector in
886 * bytes. The 1 accounts for the length byte itself, the - 2 .. ?
888 #define VECTOR_LENGTH(n) (1 + (n) - 2)
1015 .mask = cpu_to_be32(0xffffffff), /* all 3.1-compliant */
1019 .mask = cpu_to_be32(0xffffffff), /* all 3.00-compliant */
1023 .mask = cpu_to_be32(0xffffffff), /* all 2.07-compliant */
1027 .mask = cpu_to_be32(0xffffffff), /* all 2.06-compliant */
1031 .mask = cpu_to_be32(0xffffffff), /* all 2.05-compliant */
1035 .mask = cpu_to_be32(0xfffffffe), /* all 2.04-compliant and earlier */
1132 /* Old method - ELF header with PT_NOTE sections only works on BE */
1155 char name[24]; /* "IBM,RPA-Client-Config" */
1204 .namesz = sizeof("IBM,RPA-Client-Config"),
1207 .name = "IBM,RPA-Client-Config",
1239 plen = prom_getproplen(node, "ibm,ppc-interrupt-server#s"); in prom_count_smt_threads()
1265 prom_debug("MMU - either supported\n"); in prom_parse_mmu_model()
1266 support->radix_mmu = !prom_radix_disable; in prom_parse_mmu_model()
1267 support->hash_mmu = true; in prom_parse_mmu_model()
1270 prom_debug("MMU - radix only\n"); in prom_parse_mmu_model()
1278 support->radix_mmu = true; in prom_parse_mmu_model()
1281 prom_debug("MMU - hash only\n"); in prom_parse_mmu_model()
1282 support->hash_mmu = true; in prom_parse_mmu_model()
1295 prom_debug("XIVE - either mode supported\n"); in prom_parse_xive_model()
1296 support->xive = !prom_xive_disable; in prom_parse_xive_model()
1299 prom_debug("XIVE - exploitation mode supported\n"); in prom_parse_xive_model()
1307 support->xive = true; in prom_parse_xive_model()
1310 prom_debug("XIVE - legacy mode supported\n"); in prom_parse_xive_model()
1327 support->radix_gtse = !prom_radix_gtse_disable; in prom_parse_platform_support()
1345 "ibm,arch-vec-5-platform-support"); in prom_check_platform_support()
1361 prom_debug("Found ibm,arch-vec-5-platform-support, len: %d\n", in prom_check_platform_support()
1364 prom_printf("WARNING: ibm,arch-vec-5-platform-support longer than expected (len: %d)\n", in prom_check_platform_support()
1366 prom_getprop(prom.chosen, "ibm,arch-vec-5-platform-support", &vec, sizeof(vec)); in prom_check_platform_support()
1374 /* Radix preferred - Check if GTSE is also supported */ in prom_check_platform_support()
1403 /* Check ibm,arch-vec-5-platform-support and fixup vec5 if required */ in prom_send_capabilities()
1421 /* try calling the ibm,client-architecture-support method */ in prom_send_capabilities()
1422 prom_printf("Calling ibm,client-architecture-support..."); in prom_send_capabilities()
1423 if (call_prom_ret("call-method", 3, 2, &ret, in prom_send_capabilities()
1424 ADDR("ibm,client-architecture-support"), in prom_send_capabilities()
1429 prom_printf("\nWARNING: ibm,client-architecture" in prom_send_capabilities()
1430 "-support call FAILED!\n"); in prom_send_capabilities()
1443 /* no ibm,client-architecture-support call, try the old way */ in prom_send_capabilities()
1445 ADDR("/packages/elf-loader")); in prom_send_capabilities()
1447 prom_printf("couldn't open /packages/elf-loader\n"); in prom_send_capabilities()
1450 call_prom("call-method", 3, 1, ADDR("process-elf-header"), in prom_send_capabilities()
1473 * topmost, and the device-tree is allocated from the bottom. We try
1474 * to grow the device-tree allocation as we progress. If we can't,
1489 * extending the previous allocation). Used for the device-tree flattening
1521 prom_debug(" -> %lx\n", addr); in alloc_up()
1548 addr = ALIGN_DOWN(alloc_top_high - size, align); in alloc_down()
1566 base = ALIGN_DOWN(alloc_top - size, align); in alloc_down()
1568 base = ALIGN_DOWN(base - 0x100000, align)) { in alloc_down()
1580 prom_debug(" -> %lx\n", addr); in alloc_down()
1601 s--; in prom_next_cell()
1636 size = top - base; in reserve_mem()
1638 if (cnt >= (MEM_RESERVE_MAP_SIZE - 1)) in reserve_mem()
1664 prom_getprop(prom.root, "#address-cells", &val, sizeof(val)); in prom_init_mem()
1667 prom_getprop(prom.root, "#size-cells", &val, sizeof(rsc)); in prom_init_mem()
1698 call_prom("package-to-path", 3, 1, node, prom_scratch, in prom_init_mem()
1699 sizeof(prom_scratch) - 1); in prom_init_mem()
1703 while ((endp - p) >= (rac + rsc)) { in prom_init_mem()
1746 * segment 0 when running non-LPAR. in prom_init_mem()
1750 * reasonable on 32-bit, cap at 768MB on all machines. in prom_init_mem()
1817 prom_getprop(rtas_node, "ibm,os-term", &val, sizeof(val)); in prom_rtas_os_term()
1819 prom_debug("ibm,os-term: %x\n", token); in prom_rtas_os_term()
1821 prom_panic("Could not get token for ibm,os-term\n"); in prom_rtas_os_term()
1849 prom_getprop(rtas_node, "rtas-size", &val, sizeof(size)); in prom_instantiate_rtas()
1866 if (call_prom_ret("call-method", 3, 2, &entry, in prom_instantiate_rtas()
1867 ADDR("instantiate-rtas"), in prom_instantiate_rtas()
1878 prom_setprop(rtas_node, "/rtas", "linux,rtas-base", in prom_instantiate_rtas()
1881 prom_setprop(rtas_node, "/rtas", "linux,rtas-entry", in prom_instantiate_rtas()
1884 /* Check if it supports "query-cpu-stopped-state" */ in prom_instantiate_rtas()
1885 if (prom_getprop(rtas_node, "query-cpu-stopped-state", in prom_instantiate_rtas()
1921 if (prom_getprop(ibmvtpm_node, "ibm,sml-efi-reformat-supported", in prom_instantiate_sml()
1923 if (call_prom_ret("call-method", 2, 2, &succ, in prom_instantiate_sml()
1924 ADDR("reformat-sml-to-efi-alignment"), in prom_instantiate_sml()
1930 if (call_prom_ret("call-method", 2, 2, &size, in prom_instantiate_sml()
1931 ADDR("sml-get-allocated-size"), in prom_instantiate_sml()
1937 if (call_prom_ret("call-method", 2, 2, &size, in prom_instantiate_sml()
1938 ADDR("sml-get-handover-size"), in prom_instantiate_sml()
1953 if (call_prom_ret("call-method", 4, 2, &entry, in prom_instantiate_sml()
1954 ADDR("sml-handover"), in prom_instantiate_sml()
1963 prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-base", in prom_instantiate_sml()
1965 prom_setprop(ibmvtpm_node, "/vdevice/vtpm", "linux,sml-size", in prom_instantiate_sml()
2025 if (prom_getprop(node, "tce-table-minalign", &minalign, in prom_initialize_tce_table()
2028 if (prom_getprop(node, "tce-table-minsize", &minsize, in prom_initialize_tce_table()
2048 /* It seems OF doesn't null-terminate the path :-( */ in prom_initialize_tce_table()
2051 if (call_prom("package-to-path", 3, 1, node, in prom_initialize_tce_table()
2052 path, sizeof(prom_scratch) - 1) == PROM_ERROR) { in prom_initialize_tce_table()
2053 prom_printf("package-to-path failed\n"); in prom_initialize_tce_table()
2057 prom_setprop(node, path, "linux,tce-base", &base, sizeof(base)); in prom_initialize_tce_table()
2058 prom_setprop(node, path, "linux,tce-size", &minsize, sizeof(minsize)); in prom_initialize_tce_table()
2065 /* Initialize the table to have a one-to-one mapping in prom_initialize_tce_table()
2082 call_prom("call-method", 6, 0, ADDR("set-64-bit-addressing"), in prom_initialize_tce_table()
2083 phb_node, -1, minsize, in prom_initialize_tce_table()
2088 reserve_mem(local_alloc_bottom, local_alloc_top - local_alloc_bottom); in prom_initialize_tce_table()
2117 * -- Cort
2121 * 0 - 0x100 address range
2137 * On pseries, if RTAS supports "query-cpu-stopped-state", in prom_hold_cpus()
2173 /* Skip non-configured cpus. */ in prom_hold_cpus()
2178 reg = cpu_to_be32(-1); /* make sparse happy */ in prom_hold_cpus()
2188 *acknowledge = (unsigned long)-1; in prom_hold_cpus()
2191 /* Primary Thread of non-boot cpu or any thread */ in prom_hold_cpus()
2193 call_prom("start-cpu", 3, 0, node, in prom_hold_cpus()
2197 (*acknowledge == ((unsigned long)-1)); i++ ) in prom_hold_cpus()
2249 version[sizeof(version) - 1] = 0; in prom_find_mmu()
2255 call_prom("interpret", 1, 1, "dev /memory 0 to allow-reclaim"); in prom_find_mmu()
2283 call_prom("instance-to-path", 3, 1, prom.stdout, path, 255); in prom_init_stdout()
2285 prom_setprop(prom.chosen, "/chosen", "linux,stdout-path", in prom_init_stdout()
2288 /* instance-to-package fails on PA-Semi */ in prom_init_stdout()
2289 stdout_node = call_prom("instance-to-package", 1, 1, prom.stdout); in prom_init_stdout()
2297 prom_setprop(stdout_node, path, "linux,boot-display", NULL, 0); in prom_init_stdout()
2312 compat, sizeof(compat)-1); in prom_find_machine_type()
2329 prom_strstr(p, "IBM,CPBW-1.0")) in prom_find_machine_type()
2338 * - /device_type is "chrp" (please, do NOT use that for future in prom_find_machine_type()
2339 * non-IBM designs ! in prom_find_machine_type()
2340 * - it has /rtas in prom_find_machine_type()
2343 compat, sizeof(compat)-1); in prom_find_machine_type()
2353 x = prom_getproplen(rtas, "ibm,hypertas-functions"); in prom_find_machine_type()
2366 return call_prom("call-method", 6, 1, ADDR("color!"), ih, i, b, g, r); in prom_set_color()
2411 /* It seems OF doesn't null-terminate the path :-( */ in prom_check_displays()
2419 if (call_prom("package-to-path", 3, 1, node, path, in prom_check_displays()
2420 sizeof(prom_scratch) - 10) == PROM_ERROR) in prom_check_displays()
2435 * method is available. Should update this to set-colors */ in prom_check_displays()
2451 if (prom_getprop(node, "linux,boot-display", NULL, 0) != in prom_check_displays()
2491 room = alloc_top - alloc_bottom; in make_room()
2523 return s - os; in dt_find_string()
2597 room = *mem_end - *mem_start; in scan_dt_build_struct()
2600 l = call_prom("package-to-path", 3, 1, node, namep, room); in scan_dt_build_struct()
2604 if (l >= *mem_end - *mem_start) in scan_dt_build_struct()
2606 call_prom("package-to-path", 3, 1, node, namep, l); in scan_dt_build_struct()
2627 call_prom("package-to-path", 3, 1, node, path, sizeof(prom_scratch) - 1); in scan_dt_build_struct()
2706 * Check how much room we have between alloc top & bottom (+/- a in flatten_device_tree()
2709 room = alloc_top - alloc_bottom - 0x4000; in flatten_device_tree()
2717 prom_panic("Can't allocate initial device-tree chunk\n"); in flatten_device_tree()
2756 hdr->boot_cpuid_phys = cpu_to_be32(prom.cpu); in flatten_device_tree()
2757 hdr->magic = cpu_to_be32(OF_DT_HEADER); in flatten_device_tree()
2758 hdr->totalsize = cpu_to_be32(dt_struct_end - dt_header_start); in flatten_device_tree()
2759 hdr->off_dt_struct = cpu_to_be32(dt_struct_start - dt_header_start); in flatten_device_tree()
2760 hdr->off_dt_strings = cpu_to_be32(dt_string_start - dt_header_start); in flatten_device_tree()
2761 hdr->dt_strings_size = cpu_to_be32(dt_string_end - dt_string_start); in flatten_device_tree()
2762 hdr->off_mem_rsvmap = cpu_to_be32(((unsigned long)rsvmap) - dt_header_start); in flatten_device_tree()
2763 hdr->version = cpu_to_be32(OF_DT_VERSION); in flatten_device_tree()
2765 hdr->last_comp_version = cpu_to_be32(0x10); in flatten_device_tree()
2775 prom_printf(" %llx - %llx\n", in flatten_device_tree()
2785 prom_printf("Device tree strings 0x%lx -> 0x%lx\n", in flatten_device_tree()
2787 prom_printf("Device tree struct 0x%lx -> 0x%lx\n", in flatten_device_tree()
2836 /* The values for memory-controller don't have right number of cells */
2851 prom_getprop(prom.root, "#address-cells", &ac, sizeof(ac)); in fixup_device_tree_maple_memory_controller()
2852 prom_getprop(prom.root, "#size-cells", &sc, sizeof(sc)); in fixup_device_tree_maple_memory_controller()
2918 prom_printf("Fixing up IDE class-code on Pegasos...\n"); in fixup_device_tree_chrp()
2919 rc = prom_getprop(ph, "class-code", prop, sizeof(u32)); in fixup_device_tree_chrp()
2922 prom_setprop(ph, name, "class-code", prop, sizeof(u32)); in fixup_device_tree_chrp()
2933 phandle u3, i2c, mpic; in fixup_device_tree_pmac() local
2942 i2c = call_prom("finddevice", 1, 1, ADDR("/u3@0,f8000000/i2c@f8001000")); in fixup_device_tree_pmac()
2943 if (!PHANDLE_VALID(i2c)) in fixup_device_tree_pmac()
2950 if (prom_getprop(u3, "device-rev", &u3_rev, sizeof(u3_rev)) in fixup_device_tree_pmac()
2956 if (prom_getproplen(i2c, "interrupts") > 0) in fixup_device_tree_pmac()
2959 prom_printf("fixing up bogus interrupts for u3 i2c...\n"); in fixup_device_tree_pmac()
2964 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupts", in fixup_device_tree_pmac()
2967 prom_setprop(i2c, "/u3@0,f8000000/i2c@f8001000", "interrupt-parent", in fixup_device_tree_pmac()
2976 * The MPC5200 FEC driver requires an phy-handle property to tell it how
2977 * to talk to the phy. If the phy-handle property is missing, then this
2987 /* Check if /builtin/ethernet exists - bail if it doesn't */ in fixup_device_tree_efika_add_phy()
2992 /* Check if the phy-handle property exists - bail if it does */ in fixup_device_tree_efika_add_phy()
2993 rv = prom_getprop(node, "phy-handle", prop, sizeof(prop)); in fixup_device_tree_efika_add_phy()
3002 /* Check for an MDIO bus node - if missing then create one */ in fixup_device_tree_efika_add_phy()
3007 " s\" /builtin\" find-device" in fixup_device_tree_efika_add_phy()
3008 " new-device" in fixup_device_tree_efika_add_phy()
3009 " 1 encode-int s\" #address-cells\" property" in fixup_device_tree_efika_add_phy()
3010 " 0 encode-int s\" #size-cells\" property" in fixup_device_tree_efika_add_phy()
3011 " s\" mdio\" device-name" in fixup_device_tree_efika_add_phy()
3012 " s\" fsl,mpc5200b-mdio\" encode-string" in fixup_device_tree_efika_add_phy()
3015 " 0x2 encode-int" in fixup_device_tree_efika_add_phy()
3016 " 0x5 encode-int encode+" in fixup_device_tree_efika_add_phy()
3017 " 0x3 encode-int encode+" in fixup_device_tree_efika_add_phy()
3019 " finish-device"); in fixup_device_tree_efika_add_phy()
3022 /* Check for a PHY device node - if missing then create one and in fixup_device_tree_efika_add_phy()
3025 ADDR("/builtin/mdio/ethernet-phy")); in fixup_device_tree_efika_add_phy()
3029 " s\" /builtin/mdio\" find-device" in fixup_device_tree_efika_add_phy()
3030 " new-device" in fixup_device_tree_efika_add_phy()
3031 " s\" ethernet-phy\" device-name" in fixup_device_tree_efika_add_phy()
3032 " 0x10 encode-int s\" reg\" property" in fixup_device_tree_efika_add_phy()
3033 " my-self" in fixup_device_tree_efika_add_phy()
3035 " finish-device" in fixup_device_tree_efika_add_phy()
3036 " s\" /builtin/ethernet\" find-device" in fixup_device_tree_efika_add_phy()
3037 " encode-int" in fixup_device_tree_efika_add_phy()
3038 " s\" phy-handle\" property" in fixup_device_tree_efika_add_phy()
3039 " device-end"); in fixup_device_tree_efika_add_phy()
3103 /* Make sure ethernet phy-handle property exists */ in fixup_device_tree_efika()
3114 * Add an interrupt-controller property for the io-bridge to use
3129 /* check if interrupt-controller node set yet */ in fixup_device_tree_pasemi()
3130 if (prom_getproplen(iob, "interrupt-controller") !=PROM_ERROR) in fixup_device_tree_pasemi()
3133 prom_printf("adding interrupt-controller property for SB600...\n"); in fixup_device_tree_pasemi()
3135 prom_setprop(iob, name, "interrupt-controller", &val, 0); in fixup_device_tree_pasemi()
3154 /* found a node, update both interrupts and interrupt-parent */ in fixup_device_tree_pasemi()
3156 interrupts[0] -= 203; in fixup_device_tree_pasemi()
3158 interrupts[0] -= 213; in fixup_device_tree_pasemi()
3166 prom_setprop(node, pci_name, "interrupt-parent", &parent, in fixup_device_tree_pasemi()
3171 * The io-bridge has device_type set to 'io-bridge' change it to 'isa' in fixup_device_tree_pasemi()
3172 * so that generic isa-bridge code can add the SB600 and its on-board in fixup_device_tree_pasemi()
3175 name = "/pxp@0,e0000000/io-bridge@0"; in fixup_device_tree_pasemi()
3211 cpu_pkg = call_prom("instance-to-package", 1, 1, prom_cpu); in prom_find_boot_cpu()
3232 prom_setprop(prom.chosen, "/chosen", "linux,initrd-start", in prom_check_initrd()
3235 prom_setprop(prom.chosen, "/chosen", "linux,initrd-end", in prom_check_initrd()
3239 prom_initrd_end - prom_initrd_start); in prom_check_initrd()
3318 memset(&__bss_start, 0, __bss_stop - __bss_start); in prom_init()
3403 * On non-powermacs, try to instantiate RTAS. PowerMacs don't in prom_init()
3415 * On non-powermacs, put all CPUs in spin-loops. in prom_init()
3429 prom_setprop(prom.chosen, "/chosen", "linux,memory-limit", in prom_init()
3434 prom_setprop(prom.chosen, "/chosen", "linux,iommu-off", in prom_init()
3438 prom_setprop(prom.chosen, "/chosen", "linux,iommu-force-on", in prom_init()
3442 prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-start", in prom_init()
3445 prom_setprop(prom.chosen, "/chosen", "linux,tce-alloc-end", in prom_init()
3452 * Fixup any known bugs in the device-tree in prom_init()
3457 * Now finally create the flattened device-tree in prom_init()
3485 prom_debug("->dt_header_start=0x%lx\n", hdr); in prom_init()
3488 reloc_got2(-offset); in prom_init()