nvram.c (15414B)
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * Copyright (C) 2002 Benjamin Herrenschmidt (benh@kernel.crashing.org) 4 * 5 * Todo: - add support for the OF persistent properties 6 */ 7#include <linux/export.h> 8#include <linux/kernel.h> 9#include <linux/stddef.h> 10#include <linux/string.h> 11#include <linux/nvram.h> 12#include <linux/init.h> 13#include <linux/delay.h> 14#include <linux/errno.h> 15#include <linux/adb.h> 16#include <linux/pmu.h> 17#include <linux/memblock.h> 18#include <linux/completion.h> 19#include <linux/spinlock.h> 20#include <linux/of_address.h> 21#include <asm/sections.h> 22#include <asm/io.h> 23#include <asm/machdep.h> 24#include <asm/nvram.h> 25 26#include "pmac.h" 27 28#define DEBUG 29 30#ifdef DEBUG 31#define DBG(x...) printk(x) 32#else 33#define DBG(x...) 34#endif 35 36#define NVRAM_SIZE 0x2000 /* 8kB of non-volatile RAM */ 37 38#define CORE99_SIGNATURE 0x5a 39#define CORE99_ADLER_START 0x14 40 41/* On Core99, nvram is either a sharp, a micron or an AMD flash */ 42#define SM_FLASH_STATUS_DONE 0x80 43#define SM_FLASH_STATUS_ERR 0x38 44 45#define SM_FLASH_CMD_ERASE_CONFIRM 0xd0 46#define SM_FLASH_CMD_ERASE_SETUP 0x20 47#define SM_FLASH_CMD_RESET 0xff 48#define SM_FLASH_CMD_WRITE_SETUP 0x40 49#define SM_FLASH_CMD_CLEAR_STATUS 0x50 50#define SM_FLASH_CMD_READ_STATUS 0x70 51 52/* CHRP NVRAM header */ 53struct chrp_header { 54 u8 signature; 55 u8 cksum; 56 u16 len; 57 char name[12]; 58 u8 data[]; 59}; 60 61struct core99_header { 62 struct chrp_header hdr; 63 u32 adler; 64 u32 generation; 65 u32 reserved[2]; 66}; 67 68/* 69 * Read and write the non-volatile RAM on PowerMacs and CHRP machines. 70 */ 71static int nvram_naddrs; 72static volatile unsigned char __iomem *nvram_data; 73static int is_core_99; 74static int core99_bank; 75static int nvram_partitions[3]; 76// XXX Turn that into a sem 77static DEFINE_RAW_SPINLOCK(nv_lock); 78 79static int (*core99_write_bank)(int bank, u8* datas); 80static int (*core99_erase_bank)(int bank); 81 82static char *nvram_image; 83 84 85static unsigned char core99_nvram_read_byte(int addr) 86{ 87 if (nvram_image == NULL) 88 return 0xff; 89 return nvram_image[addr]; 90} 91 92static void core99_nvram_write_byte(int addr, unsigned char val) 93{ 94 if (nvram_image == NULL) 95 return; 96 nvram_image[addr] = val; 97} 98 99static ssize_t core99_nvram_read(char *buf, size_t count, loff_t *index) 100{ 101 int i; 102 103 if (nvram_image == NULL) 104 return -ENODEV; 105 if (*index > NVRAM_SIZE) 106 return 0; 107 108 i = *index; 109 if (i + count > NVRAM_SIZE) 110 count = NVRAM_SIZE - i; 111 112 memcpy(buf, &nvram_image[i], count); 113 *index = i + count; 114 return count; 115} 116 117static ssize_t core99_nvram_write(char *buf, size_t count, loff_t *index) 118{ 119 int i; 120 121 if (nvram_image == NULL) 122 return -ENODEV; 123 if (*index > NVRAM_SIZE) 124 return 0; 125 126 i = *index; 127 if (i + count > NVRAM_SIZE) 128 count = NVRAM_SIZE - i; 129 130 memcpy(&nvram_image[i], buf, count); 131 *index = i + count; 132 return count; 133} 134 135static ssize_t core99_nvram_size(void) 136{ 137 if (nvram_image == NULL) 138 return -ENODEV; 139 return NVRAM_SIZE; 140} 141 142#ifdef CONFIG_PPC32 143static volatile unsigned char __iomem *nvram_addr; 144static int nvram_mult; 145 146static ssize_t ppc32_nvram_size(void) 147{ 148 return NVRAM_SIZE; 149} 150 151static unsigned char direct_nvram_read_byte(int addr) 152{ 153 return in_8(&nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult]); 154} 155 156static void direct_nvram_write_byte(int addr, unsigned char val) 157{ 158 out_8(&nvram_data[(addr & (NVRAM_SIZE - 1)) * nvram_mult], val); 159} 160 161 162static unsigned char indirect_nvram_read_byte(int addr) 163{ 164 unsigned char val; 165 unsigned long flags; 166 167 raw_spin_lock_irqsave(&nv_lock, flags); 168 out_8(nvram_addr, addr >> 5); 169 val = in_8(&nvram_data[(addr & 0x1f) << 4]); 170 raw_spin_unlock_irqrestore(&nv_lock, flags); 171 172 return val; 173} 174 175static void indirect_nvram_write_byte(int addr, unsigned char val) 176{ 177 unsigned long flags; 178 179 raw_spin_lock_irqsave(&nv_lock, flags); 180 out_8(nvram_addr, addr >> 5); 181 out_8(&nvram_data[(addr & 0x1f) << 4], val); 182 raw_spin_unlock_irqrestore(&nv_lock, flags); 183} 184 185 186#ifdef CONFIG_ADB_PMU 187 188static void pmu_nvram_complete(struct adb_request *req) 189{ 190 if (req->arg) 191 complete((struct completion *)req->arg); 192} 193 194static unsigned char pmu_nvram_read_byte(int addr) 195{ 196 struct adb_request req; 197 DECLARE_COMPLETION_ONSTACK(req_complete); 198 199 req.arg = system_state == SYSTEM_RUNNING ? &req_complete : NULL; 200 if (pmu_request(&req, pmu_nvram_complete, 3, PMU_READ_NVRAM, 201 (addr >> 8) & 0xff, addr & 0xff)) 202 return 0xff; 203 if (system_state == SYSTEM_RUNNING) 204 wait_for_completion(&req_complete); 205 while (!req.complete) 206 pmu_poll(); 207 return req.reply[0]; 208} 209 210static void pmu_nvram_write_byte(int addr, unsigned char val) 211{ 212 struct adb_request req; 213 DECLARE_COMPLETION_ONSTACK(req_complete); 214 215 req.arg = system_state == SYSTEM_RUNNING ? &req_complete : NULL; 216 if (pmu_request(&req, pmu_nvram_complete, 4, PMU_WRITE_NVRAM, 217 (addr >> 8) & 0xff, addr & 0xff, val)) 218 return; 219 if (system_state == SYSTEM_RUNNING) 220 wait_for_completion(&req_complete); 221 while (!req.complete) 222 pmu_poll(); 223} 224 225#endif /* CONFIG_ADB_PMU */ 226#endif /* CONFIG_PPC32 */ 227 228static u8 chrp_checksum(struct chrp_header* hdr) 229{ 230 u8 *ptr; 231 u16 sum = hdr->signature; 232 for (ptr = (u8 *)&hdr->len; ptr < hdr->data; ptr++) 233 sum += *ptr; 234 while (sum > 0xFF) 235 sum = (sum & 0xFF) + (sum>>8); 236 return sum; 237} 238 239static u32 core99_calc_adler(u8 *buffer) 240{ 241 int cnt; 242 u32 low, high; 243 244 buffer += CORE99_ADLER_START; 245 low = 1; 246 high = 0; 247 for (cnt=0; cnt<(NVRAM_SIZE-CORE99_ADLER_START); cnt++) { 248 if ((cnt % 5000) == 0) { 249 high %= 65521UL; 250 high %= 65521UL; 251 } 252 low += buffer[cnt]; 253 high += low; 254 } 255 low %= 65521UL; 256 high %= 65521UL; 257 258 return (high << 16) | low; 259} 260 261static u32 __init core99_check(u8 *datas) 262{ 263 struct core99_header* hdr99 = (struct core99_header*)datas; 264 265 if (hdr99->hdr.signature != CORE99_SIGNATURE) { 266 DBG("Invalid signature\n"); 267 return 0; 268 } 269 if (hdr99->hdr.cksum != chrp_checksum(&hdr99->hdr)) { 270 DBG("Invalid checksum\n"); 271 return 0; 272 } 273 if (hdr99->adler != core99_calc_adler(datas)) { 274 DBG("Invalid adler\n"); 275 return 0; 276 } 277 return hdr99->generation; 278} 279 280static int sm_erase_bank(int bank) 281{ 282 int stat; 283 unsigned long timeout; 284 285 u8 __iomem *base = (u8 __iomem *)nvram_data + core99_bank*NVRAM_SIZE; 286 287 DBG("nvram: Sharp/Micron Erasing bank %d...\n", bank); 288 289 out_8(base, SM_FLASH_CMD_ERASE_SETUP); 290 out_8(base, SM_FLASH_CMD_ERASE_CONFIRM); 291 timeout = 0; 292 do { 293 if (++timeout > 1000000) { 294 printk(KERN_ERR "nvram: Sharp/Micron flash erase timeout !\n"); 295 break; 296 } 297 out_8(base, SM_FLASH_CMD_READ_STATUS); 298 stat = in_8(base); 299 } while (!(stat & SM_FLASH_STATUS_DONE)); 300 301 out_8(base, SM_FLASH_CMD_CLEAR_STATUS); 302 out_8(base, SM_FLASH_CMD_RESET); 303 304 if (memchr_inv(base, 0xff, NVRAM_SIZE)) { 305 printk(KERN_ERR "nvram: Sharp/Micron flash erase failed !\n"); 306 return -ENXIO; 307 } 308 return 0; 309} 310 311static int sm_write_bank(int bank, u8* datas) 312{ 313 int i, stat = 0; 314 unsigned long timeout; 315 316 u8 __iomem *base = (u8 __iomem *)nvram_data + core99_bank*NVRAM_SIZE; 317 318 DBG("nvram: Sharp/Micron Writing bank %d...\n", bank); 319 320 for (i=0; i<NVRAM_SIZE; i++) { 321 out_8(base+i, SM_FLASH_CMD_WRITE_SETUP); 322 udelay(1); 323 out_8(base+i, datas[i]); 324 timeout = 0; 325 do { 326 if (++timeout > 1000000) { 327 printk(KERN_ERR "nvram: Sharp/Micron flash write timeout !\n"); 328 break; 329 } 330 out_8(base, SM_FLASH_CMD_READ_STATUS); 331 stat = in_8(base); 332 } while (!(stat & SM_FLASH_STATUS_DONE)); 333 if (!(stat & SM_FLASH_STATUS_DONE)) 334 break; 335 } 336 out_8(base, SM_FLASH_CMD_CLEAR_STATUS); 337 out_8(base, SM_FLASH_CMD_RESET); 338 if (memcmp(base, datas, NVRAM_SIZE)) { 339 printk(KERN_ERR "nvram: Sharp/Micron flash write failed !\n"); 340 return -ENXIO; 341 } 342 return 0; 343} 344 345static int amd_erase_bank(int bank) 346{ 347 int stat = 0; 348 unsigned long timeout; 349 350 u8 __iomem *base = (u8 __iomem *)nvram_data + core99_bank*NVRAM_SIZE; 351 352 DBG("nvram: AMD Erasing bank %d...\n", bank); 353 354 /* Unlock 1 */ 355 out_8(base+0x555, 0xaa); 356 udelay(1); 357 /* Unlock 2 */ 358 out_8(base+0x2aa, 0x55); 359 udelay(1); 360 361 /* Sector-Erase */ 362 out_8(base+0x555, 0x80); 363 udelay(1); 364 out_8(base+0x555, 0xaa); 365 udelay(1); 366 out_8(base+0x2aa, 0x55); 367 udelay(1); 368 out_8(base, 0x30); 369 udelay(1); 370 371 timeout = 0; 372 do { 373 if (++timeout > 1000000) { 374 printk(KERN_ERR "nvram: AMD flash erase timeout !\n"); 375 break; 376 } 377 stat = in_8(base) ^ in_8(base); 378 } while (stat != 0); 379 380 /* Reset */ 381 out_8(base, 0xf0); 382 udelay(1); 383 384 if (memchr_inv(base, 0xff, NVRAM_SIZE)) { 385 printk(KERN_ERR "nvram: AMD flash erase failed !\n"); 386 return -ENXIO; 387 } 388 return 0; 389} 390 391static int amd_write_bank(int bank, u8* datas) 392{ 393 int i, stat = 0; 394 unsigned long timeout; 395 396 u8 __iomem *base = (u8 __iomem *)nvram_data + core99_bank*NVRAM_SIZE; 397 398 DBG("nvram: AMD Writing bank %d...\n", bank); 399 400 for (i=0; i<NVRAM_SIZE; i++) { 401 /* Unlock 1 */ 402 out_8(base+0x555, 0xaa); 403 udelay(1); 404 /* Unlock 2 */ 405 out_8(base+0x2aa, 0x55); 406 udelay(1); 407 408 /* Write single word */ 409 out_8(base+0x555, 0xa0); 410 udelay(1); 411 out_8(base+i, datas[i]); 412 413 timeout = 0; 414 do { 415 if (++timeout > 1000000) { 416 printk(KERN_ERR "nvram: AMD flash write timeout !\n"); 417 break; 418 } 419 stat = in_8(base) ^ in_8(base); 420 } while (stat != 0); 421 if (stat != 0) 422 break; 423 } 424 425 /* Reset */ 426 out_8(base, 0xf0); 427 udelay(1); 428 429 if (memcmp(base, datas, NVRAM_SIZE)) { 430 printk(KERN_ERR "nvram: AMD flash write failed !\n"); 431 return -ENXIO; 432 } 433 return 0; 434} 435 436static void __init lookup_partitions(void) 437{ 438 u8 buffer[17]; 439 int i, offset; 440 struct chrp_header* hdr; 441 442 if (pmac_newworld) { 443 nvram_partitions[pmac_nvram_OF] = -1; 444 nvram_partitions[pmac_nvram_XPRAM] = -1; 445 nvram_partitions[pmac_nvram_NR] = -1; 446 hdr = (struct chrp_header *)buffer; 447 448 offset = 0; 449 buffer[16] = 0; 450 do { 451 for (i=0;i<16;i++) 452 buffer[i] = ppc_md.nvram_read_val(offset+i); 453 if (!strcmp(hdr->name, "common")) 454 nvram_partitions[pmac_nvram_OF] = offset + 0x10; 455 if (!strcmp(hdr->name, "APL,MacOS75")) { 456 nvram_partitions[pmac_nvram_XPRAM] = offset + 0x10; 457 nvram_partitions[pmac_nvram_NR] = offset + 0x110; 458 } 459 offset += (hdr->len * 0x10); 460 } while(offset < NVRAM_SIZE); 461 } else { 462 nvram_partitions[pmac_nvram_OF] = 0x1800; 463 nvram_partitions[pmac_nvram_XPRAM] = 0x1300; 464 nvram_partitions[pmac_nvram_NR] = 0x1400; 465 } 466 DBG("nvram: OF partition at 0x%x\n", nvram_partitions[pmac_nvram_OF]); 467 DBG("nvram: XP partition at 0x%x\n", nvram_partitions[pmac_nvram_XPRAM]); 468 DBG("nvram: NR partition at 0x%x\n", nvram_partitions[pmac_nvram_NR]); 469} 470 471static void core99_nvram_sync(void) 472{ 473 struct core99_header* hdr99; 474 unsigned long flags; 475 476 if (!is_core_99 || !nvram_data || !nvram_image) 477 return; 478 479 raw_spin_lock_irqsave(&nv_lock, flags); 480 if (!memcmp(nvram_image, (u8*)nvram_data + core99_bank*NVRAM_SIZE, 481 NVRAM_SIZE)) 482 goto bail; 483 484 DBG("Updating nvram...\n"); 485 486 hdr99 = (struct core99_header*)nvram_image; 487 hdr99->generation++; 488 hdr99->hdr.signature = CORE99_SIGNATURE; 489 hdr99->hdr.cksum = chrp_checksum(&hdr99->hdr); 490 hdr99->adler = core99_calc_adler(nvram_image); 491 core99_bank = core99_bank ? 0 : 1; 492 if (core99_erase_bank) 493 if (core99_erase_bank(core99_bank)) { 494 printk("nvram: Error erasing bank %d\n", core99_bank); 495 goto bail; 496 } 497 if (core99_write_bank) 498 if (core99_write_bank(core99_bank, nvram_image)) 499 printk("nvram: Error writing bank %d\n", core99_bank); 500 bail: 501 raw_spin_unlock_irqrestore(&nv_lock, flags); 502 503#ifdef DEBUG 504 mdelay(2000); 505#endif 506} 507 508static int __init core99_nvram_setup(struct device_node *dp, unsigned long addr) 509{ 510 int i; 511 u32 gen_bank0, gen_bank1; 512 513 if (nvram_naddrs < 1) { 514 printk(KERN_ERR "nvram: no address\n"); 515 return -EINVAL; 516 } 517 nvram_image = memblock_alloc(NVRAM_SIZE, SMP_CACHE_BYTES); 518 if (!nvram_image) 519 panic("%s: Failed to allocate %u bytes\n", __func__, 520 NVRAM_SIZE); 521 nvram_data = ioremap(addr, NVRAM_SIZE*2); 522 nvram_naddrs = 1; /* Make sure we get the correct case */ 523 524 DBG("nvram: Checking bank 0...\n"); 525 526 gen_bank0 = core99_check((u8 *)nvram_data); 527 gen_bank1 = core99_check((u8 *)nvram_data + NVRAM_SIZE); 528 core99_bank = (gen_bank0 < gen_bank1) ? 1 : 0; 529 530 DBG("nvram: gen0=%d, gen1=%d\n", gen_bank0, gen_bank1); 531 DBG("nvram: Active bank is: %d\n", core99_bank); 532 533 for (i=0; i<NVRAM_SIZE; i++) 534 nvram_image[i] = nvram_data[i + core99_bank*NVRAM_SIZE]; 535 536 ppc_md.nvram_read_val = core99_nvram_read_byte; 537 ppc_md.nvram_write_val = core99_nvram_write_byte; 538 ppc_md.nvram_read = core99_nvram_read; 539 ppc_md.nvram_write = core99_nvram_write; 540 ppc_md.nvram_size = core99_nvram_size; 541 ppc_md.nvram_sync = core99_nvram_sync; 542 ppc_md.machine_shutdown = core99_nvram_sync; 543 /* 544 * Maybe we could be smarter here though making an exclusive list 545 * of known flash chips is a bit nasty as older OF didn't provide us 546 * with a useful "compatible" entry. A solution would be to really 547 * identify the chip using flash id commands and base ourselves on 548 * a list of known chips IDs 549 */ 550 if (of_device_is_compatible(dp, "amd-0137")) { 551 core99_erase_bank = amd_erase_bank; 552 core99_write_bank = amd_write_bank; 553 } else { 554 core99_erase_bank = sm_erase_bank; 555 core99_write_bank = sm_write_bank; 556 } 557 return 0; 558} 559 560int __init pmac_nvram_init(void) 561{ 562 struct device_node *dp; 563 struct resource r1, r2; 564 unsigned int s1 = 0, s2 = 0; 565 int err = 0; 566 567 nvram_naddrs = 0; 568 569 dp = of_find_node_by_name(NULL, "nvram"); 570 if (dp == NULL) { 571 printk(KERN_ERR "Can't find NVRAM device\n"); 572 return -ENODEV; 573 } 574 575 /* Try to obtain an address */ 576 if (of_address_to_resource(dp, 0, &r1) == 0) { 577 nvram_naddrs = 1; 578 s1 = resource_size(&r1); 579 if (of_address_to_resource(dp, 1, &r2) == 0) { 580 nvram_naddrs = 2; 581 s2 = resource_size(&r2); 582 } 583 } 584 585 is_core_99 = of_device_is_compatible(dp, "nvram,flash"); 586 if (is_core_99) { 587 err = core99_nvram_setup(dp, r1.start); 588 goto bail; 589 } 590 591#ifdef CONFIG_PPC32 592 if (machine_is(chrp) && nvram_naddrs == 1) { 593 nvram_data = ioremap(r1.start, s1); 594 nvram_mult = 1; 595 ppc_md.nvram_read_val = direct_nvram_read_byte; 596 ppc_md.nvram_write_val = direct_nvram_write_byte; 597 ppc_md.nvram_size = ppc32_nvram_size; 598 } else if (nvram_naddrs == 1) { 599 nvram_data = ioremap(r1.start, s1); 600 nvram_mult = (s1 + NVRAM_SIZE - 1) / NVRAM_SIZE; 601 ppc_md.nvram_read_val = direct_nvram_read_byte; 602 ppc_md.nvram_write_val = direct_nvram_write_byte; 603 ppc_md.nvram_size = ppc32_nvram_size; 604 } else if (nvram_naddrs == 2) { 605 nvram_addr = ioremap(r1.start, s1); 606 nvram_data = ioremap(r2.start, s2); 607 ppc_md.nvram_read_val = indirect_nvram_read_byte; 608 ppc_md.nvram_write_val = indirect_nvram_write_byte; 609 ppc_md.nvram_size = ppc32_nvram_size; 610 } else if (nvram_naddrs == 0 && sys_ctrler == SYS_CTRLER_PMU) { 611#ifdef CONFIG_ADB_PMU 612 nvram_naddrs = -1; 613 ppc_md.nvram_read_val = pmu_nvram_read_byte; 614 ppc_md.nvram_write_val = pmu_nvram_write_byte; 615 ppc_md.nvram_size = ppc32_nvram_size; 616#endif /* CONFIG_ADB_PMU */ 617 } else { 618 printk(KERN_ERR "Incompatible type of NVRAM\n"); 619 err = -ENXIO; 620 } 621#endif /* CONFIG_PPC32 */ 622bail: 623 of_node_put(dp); 624 if (err == 0) 625 lookup_partitions(); 626 return err; 627} 628 629int pmac_get_partition(int partition) 630{ 631 return nvram_partitions[partition]; 632} 633 634u8 pmac_xpram_read(int xpaddr) 635{ 636 int offset = pmac_get_partition(pmac_nvram_XPRAM); 637 638 if (offset < 0 || xpaddr < 0 || xpaddr > 0x100) 639 return 0xff; 640 641 return ppc_md.nvram_read_val(xpaddr + offset); 642} 643 644void pmac_xpram_write(int xpaddr, u8 data) 645{ 646 int offset = pmac_get_partition(pmac_nvram_XPRAM); 647 648 if (offset < 0 || xpaddr < 0 || xpaddr > 0x100) 649 return; 650 651 ppc_md.nvram_write_val(xpaddr + offset, data); 652} 653 654EXPORT_SYMBOL(pmac_get_partition); 655EXPORT_SYMBOL(pmac_xpram_read); 656EXPORT_SYMBOL(pmac_xpram_write);