linux-old/arch/parisc/kernel/firmware.c
<<
>>
Prefs
   1/* arch/parisc/kernel/firmware.c  - safe pdc access routines
   2 *
   3 * Copyright 1999 SuSE GmbH Nuernberg (Philipp Rumpf, prumpf@tux.org)
   4 * portions Copyright 1999 The Puffin Group, (Alex deVries, David Kennedy)
   5 *
   6 * only these routines should be used out of the real kernel (i.e. everything
   7 * using virtual addresses) for obvious reasons */
   8
   9/*      I think it would be in everyone's best interest to follow this
  10 *      guidelines when writing PDC wrappers:
  11 *
  12 *       - the name of the pdc wrapper should match one of the macros
  13 *         used for the first two arguments
  14 *       - don't use caps for random parts of the name
  15 *       - use the static PDC result buffers and "copyout" to structs
  16 *         supplied by the caller to encapsulate alignment restrictions
  17 *       - hold pdc_lock while in PDC or using static result buffers
  18 *       - use __pa() to convert virtual (kernel) pointers to physical
  19 *         ones.
  20 *       - the name of the struct used for pdc return values should equal
  21 *         one of the macros used for the first two arguments to the
  22 *         corresponding PDC call
  23 *       - keep the order of arguments
  24 *       - don't be smart (setting trailing NUL bytes for strings, return
  25 *         something useful even if the call failed) unless you are sure
  26 *         it's not going to affect functionality or performance
  27 *
  28 *      Example:
  29 *      int pdc_cache_info(struct pdc_cache_info *cache_info )
  30 *      {
  31 *              int retval;
  32 *
  33 *              spin_lock_irq(&pdc_lock);
  34 *              retval = mem_pdc_call(PDC_CACHE,PDC_CACHE_INFO,__pa(cache_info),0);
  35 *              convert_to_wide(pdc_result);
  36 *              memcpy(cache_info, pdc_result, sizeof(*cache_info));
  37 *              spin_unlock_irq(&pdc_lock);
  38 *
  39 *              return retval;
  40 *      }
  41 *                                      prumpf  991016  
  42 */
  43
  44#include <linux/kernel.h>
  45#include <linux/string.h>
  46#include <linux/spinlock.h>
  47#include <linux/init.h>
  48#include <linux/delay.h>
  49
  50#include <asm/page.h>
  51#include <asm/pdc.h>
  52#include <asm/system.h>
  53#include <asm/processor.h>      /* for boot_cpu_data */
  54
  55#include <stdarg.h>
  56
  57static spinlock_t pdc_lock = SPIN_LOCK_UNLOCKED;
  58static unsigned long pdc_result[32] __attribute__ ((aligned (8)));
  59static unsigned long pdc_result2[32] __attribute__ ((aligned (8)));
  60
  61/* on all currently-supported platforms, IODC I/O calls are always
  62 * 32-bit calls, and MEM_PDC calls are always the same width as the OS.
  63 * This means Cxxx boxes can't run wide kernels right now. -PB
  64 *
  65 * CONFIG_PDC_NARROW has been added to allow 64-bit kernels to run on
  66 * systems with 32-bit MEM_PDC calls. This will allow wide kernels to
  67 * run on Cxxx boxes now. -RB
  68 *
  69 * Note that some PAT boxes may have 64-bit IODC I/O...
  70 */
  71
  72#ifdef __LP64__
  73static long real64_call(unsigned long function, ...);
  74#endif
  75static long real32_call(unsigned long function, ...);
  76
  77#if defined(__LP64__) && ! defined(CONFIG_PDC_NARROW)
  78#define MEM_PDC (unsigned long)(PAGE0->mem_pdc_hi) << 32 | PAGE0->mem_pdc
  79#   define mem_pdc_call(args...) real64_call(MEM_PDC, args)
  80#else
  81#define MEM_PDC (unsigned long)PAGE0->mem_pdc
  82#   define mem_pdc_call(args...) real32_call(MEM_PDC, args)
  83#endif
  84
  85
  86/**
  87 * f_extend - Convert PDC addresses to kernel addresses.
  88 * @address: Address returned from PDC.
  89 *
  90 * This function is used to convert PDC addresses into kernel addresses
  91 * when the PDC address size and kernel address size are different.
  92 */
  93static unsigned long f_extend(unsigned long address)
  94{
  95#ifdef CONFIG_PDC_NARROW
  96        if((address & 0xff000000) == 0xf0000000)
  97                return 0xf0f0f0f000000000 | (u32)address;
  98
  99        if((address & 0xf0000000) == 0xf0000000)
 100                return 0xffffffff00000000 | (u32)address;
 101#endif
 102        return address;
 103}
 104
 105/**
 106 * convert_to_wide - Convert the return buffer addresses into kernel addresses.
 107 * @address: The return buffer from PDC.
 108 *
 109 * This function is used to convert the return buffer addresses retrieved from PDC
 110 * into kernel addresses when the PDC address size and kernel address size are
 111 * different.
 112 */
 113static void convert_to_wide(unsigned long *addr)
 114{
 115#ifdef CONFIG_PDC_NARROW
 116        int i;
 117        unsigned *p = (unsigned int *)addr;
 118        for(i = 31; i >= 0; --i)
 119                addr[i] = p[i];
 120#endif
 121}
 122
 123/**
 124 * pdc_emergency_unlock - Unlock the linux pdc lock
 125 *
 126 * This call unlocks the linux pdc lock in case we need some PDC functions
 127 * (like pdc_add_valid) during kernel stack dump.
 128 */
 129void pdc_emergency_unlock(void)
 130{
 131        spin_unlock(&pdc_lock);
 132}
 133
 134
 135/**
 136 * pdc_add_valid - Verify address can be accessed without causing a HPMC.
 137 * @address: Address to be verified.
 138 *
 139 * This PDC call attempts to read from the specified address and verifies
 140 * if the address is valid.
 141 * 
 142 * The return value is PDC_OK (0) in case accessing this address is valid.
 143 */
 144int pdc_add_valid(unsigned long address)
 145{
 146        int retval;
 147
 148        spin_lock_irq(&pdc_lock);
 149        retval = mem_pdc_call(PDC_ADD_VALID, PDC_ADD_VALID_VERIFY, address);
 150        spin_unlock_irq(&pdc_lock);
 151
 152        return retval;
 153}
 154
 155/**
 156 * pdc_chassis_info - Return chassis information.
 157 * @result: The return buffer.
 158 * @chassis_info: The memory buffer address.
 159 * @len: The size of the memory buffer address.
 160 *
 161 * An HVERSION dependent call for returning the chassis information.
 162 */
 163int __init pdc_chassis_info(struct pdc_chassis_info *chassis_info, void *led_info, unsigned long len)
 164{
 165        int retval;
 166
 167        spin_lock_irq(&pdc_lock);
 168        memcpy(&pdc_result, chassis_info, sizeof(*chassis_info));
 169        memcpy(&pdc_result2, led_info, len);
 170        retval = mem_pdc_call(PDC_CHASSIS, PDC_RETURN_CHASSIS_INFO,
 171                              __pa(pdc_result), __pa(pdc_result2), len);
 172        memcpy(chassis_info, pdc_result, sizeof(*chassis_info));
 173        memcpy(led_info, pdc_result2, len);
 174        spin_unlock_irq(&pdc_lock);
 175
 176        return retval;
 177}
 178
 179/**
 180 * pdc_pat_chassis_send_log - Sends a PDC PAT CHASSIS log message.
 181 * @retval: -1 on error, 0 on success. Other value are PDC errors
 182 *
 183 * Must be correctly formatted or expect system crash
 184 */
 185#ifdef __LP64__
 186int pdc_pat_chassis_send_log(unsigned long state, unsigned long data)
 187{
 188        if (!is_pdc_pat())
 189                return -1;
 190                
 191        int retval = 0;
 192        
 193        spin_lock_irq(&pdc_lock);
 194        retval = mem_pdc_call(PDC_PAT_CHASSIS_LOG, PDC_PAT_CHASSIS_WRITE_LOG, __pa(&state), __pa(&data));
 195        spin_unlock_irq(&pdc_lock);
 196        
 197        return retval;
 198}
 199#endif
 200
 201/**
 202 * pdc_chassis_disp - Updates display
 203 * @retval: -1 on error, 0 on success
 204 *
 205 * Works on old PDC only (E class, others?)
 206 */
 207int pdc_chassis_disp(unsigned long disp)
 208{
 209        int retval = 0;
 210
 211        spin_lock_irq(&pdc_lock);
 212        retval = mem_pdc_call(PDC_CHASSIS, PDC_CHASSIS_DISP, disp);
 213        spin_unlock_irq(&pdc_lock);
 214
 215        return retval;
 216}
 217
 218/**
 219 * pdc_coproc_cfg - To identify coprocessors attached to the processor.
 220 * @pdc_coproc_info: Return buffer address.
 221 *
 222 * This PDC call returns the presence and status of all the coprocessors
 223 * attached to the processor.
 224 */
 225int __init pdc_coproc_cfg(struct pdc_coproc_cfg *pdc_coproc_info)
 226{
 227        int retval;
 228
 229        spin_lock_irq(&pdc_lock);
 230        retval = mem_pdc_call(PDC_COPROC, PDC_COPROC_CFG, __pa(pdc_result));
 231        convert_to_wide(pdc_result);
 232        pdc_coproc_info->ccr_functional = pdc_result[0];
 233        pdc_coproc_info->ccr_present = pdc_result[1];
 234        pdc_coproc_info->revision = pdc_result[17];
 235        pdc_coproc_info->model = pdc_result[18];
 236        spin_unlock_irq(&pdc_lock);
 237
 238        return retval;
 239}
 240
 241/**
 242 * pdc_iodc_read - Read data from the modules IODC.
 243 * @actcnt: The actual number of bytes.
 244 * @hpa: The HPA of the module for the iodc read.
 245 * @index: The iodc entry point.
 246 * @iodc_data: A buffer memory for the iodc options.
 247 * @iodc_data_size: Size of the memory buffer.
 248 *
 249 * This PDC call reads from the IODC of the module specified by the hpa
 250 * argument.
 251 */
 252int pdc_iodc_read(unsigned long *actcnt, unsigned long hpa, unsigned int index,
 253                  void *iodc_data, unsigned int iodc_data_size)
 254{
 255        int retval;
 256
 257        spin_lock_irq(&pdc_lock);
 258        retval = mem_pdc_call(PDC_IODC, PDC_IODC_READ, __pa(pdc_result), hpa, 
 259                              index, __pa(pdc_result2), iodc_data_size);
 260        convert_to_wide(pdc_result);
 261        *actcnt = pdc_result[0];
 262        memcpy(iodc_data, pdc_result2, iodc_data_size);
 263        spin_unlock_irq(&pdc_lock);
 264
 265        return retval;
 266}
 267
 268/**
 269 * pdc_system_map_find_mods - Locate unarchitected modules.
 270 * @pdc_mod_info: Return buffer address.
 271 * @mod_path: pointer to dev path structure.
 272 * @mod_index: fixed address module index.
 273 *
 274 * To locate and identify modules which reside at fixed I/O addresses, which
 275 * do not self-identify via architected bus walks.
 276 */
 277int pdc_system_map_find_mods(struct pdc_system_map_mod_info *pdc_mod_info,
 278                             struct pdc_module_path *mod_path, long mod_index)
 279{
 280        int retval;
 281
 282        spin_lock_irq(&pdc_lock);
 283        retval = mem_pdc_call(PDC_SYSTEM_MAP, PDC_FIND_MODULE, __pa(pdc_result), 
 284                              __pa(pdc_result2), mod_index);
 285        convert_to_wide(pdc_result);
 286        memcpy(pdc_mod_info, pdc_result, sizeof(*pdc_mod_info));
 287        memcpy(mod_path, pdc_result2, sizeof(*mod_path));
 288        spin_unlock_irq(&pdc_lock);
 289
 290        pdc_mod_info->mod_addr = f_extend(pdc_mod_info->mod_addr);
 291        return retval;
 292}
 293
 294/**
 295 * pdc_system_map_find_addrs - Retrieve additional address ranges.
 296 * @pdc_addr_info: Return buffer address.
 297 * @mod_index: Fixed address module index.
 298 * @addr_index: Address range index.
 299 * 
 300 * Retrieve additional information about subsequent address ranges for modules
 301 * with multiple address ranges.  
 302 */
 303int pdc_system_map_find_addrs(struct pdc_system_map_addr_info *pdc_addr_info, 
 304                              long mod_index, long addr_index)
 305{
 306        int retval;
 307
 308        spin_lock_irq(&pdc_lock);
 309        retval = mem_pdc_call(PDC_SYSTEM_MAP, PDC_FIND_ADDRESS, __pa(pdc_result),
 310                              mod_index, addr_index);
 311        convert_to_wide(pdc_result);
 312        memcpy(pdc_addr_info, pdc_result, sizeof(*pdc_addr_info));
 313        spin_unlock_irq(&pdc_lock);
 314
 315        pdc_addr_info->mod_addr = f_extend(pdc_addr_info->mod_addr);
 316        return retval;
 317}
 318
 319/**
 320 * pdc_model_info - Return model information about the processor.
 321 * @model: The return buffer.
 322 *
 323 * Returns the version numbers, identifiers, and capabilities from the processor module.
 324 */
 325int pdc_model_info(struct pdc_model *model) 
 326{
 327        int retval;
 328
 329        spin_lock_irq(&pdc_lock);
 330        retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_INFO, __pa(pdc_result), 0);
 331        convert_to_wide(pdc_result);
 332        memcpy(model, pdc_result, sizeof(*model));
 333        spin_unlock_irq(&pdc_lock);
 334
 335        return retval;
 336}
 337
 338/**
 339 * pdc_model_sysmodel - Get the system model name.
 340 * @name: A char array of at least 81 characters.
 341 *
 342 * Get system model name from PDC ROM (e.g. 9000/715 or 9000/778/B160L)
 343 */
 344int pdc_model_sysmodel(char *name)
 345{
 346        int retval;
 347
 348        spin_lock_irq(&pdc_lock);
 349        retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_SYSMODEL, __pa(pdc_result),
 350                              OS_ID_HPUX, __pa(name));
 351        convert_to_wide(pdc_result);
 352
 353        if (retval == PDC_OK) {
 354                name[pdc_result[0]] = '\0'; /* add trailing '\0' */
 355        } else {
 356                name[0] = 0;
 357        }
 358        spin_unlock_irq(&pdc_lock);
 359
 360        return retval;
 361}
 362
 363/**
 364 * pdc_model_versions - Identify the version number of each processor.
 365 * @cpu_id: The return buffer.
 366 * @id: The id of the processor to check.
 367 *
 368 * Returns the version number for each processor component.
 369 *
 370 * This comment was here before, but I do not know what it means :( -RB
 371 * id: 0 = cpu revision, 1 = boot-rom-version
 372 */
 373int pdc_model_versions(unsigned long *versions, int id)
 374{
 375        int retval;
 376
 377        spin_lock_irq(&pdc_lock);
 378        retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_VERSIONS, __pa(pdc_result), id);
 379        convert_to_wide(pdc_result);
 380        *versions = pdc_result[0];
 381        spin_unlock_irq(&pdc_lock);
 382
 383        return retval;
 384}
 385
 386/**
 387 * pdc_model_cpuid - Returns the CPU_ID.
 388 * @cpu_id: The return buffer.
 389 *
 390 * Returns the CPU_ID value which uniquely identifies the cpu portion of
 391 * the processor module.
 392 */
 393int pdc_model_cpuid(unsigned long *cpu_id)
 394{
 395        int retval;
 396
 397        spin_lock_irq(&pdc_lock);
 398        pdc_result[0] = 0; /* preset zero (call may not be implemented!) */
 399        retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CPU_ID, __pa(pdc_result), 0);
 400        convert_to_wide(pdc_result);
 401        *cpu_id = pdc_result[0];
 402        spin_unlock_irq(&pdc_lock);
 403
 404        return retval;
 405}
 406
 407/**
 408 * pdc_model_capabilities - Returns the platform capabilities.
 409 * @capabilities: The return buffer.
 410 *
 411 * Returns information about platform support for 32- and/or 64-bit
 412 * OSes, IO-PDIR coherency, and virtual aliasing.
 413 */
 414int pdc_model_capabilities(unsigned long *capabilities)
 415{
 416        int retval;
 417
 418        spin_lock_irq(&pdc_lock);
 419        pdc_result[0] = 0; /* preset zero (call may not be implemented!) */
 420        retval = mem_pdc_call(PDC_MODEL, PDC_MODEL_CAPABILITIES, __pa(pdc_result), 0);
 421        convert_to_wide(pdc_result);
 422        *capabilities = pdc_result[0];
 423        spin_unlock_irq(&pdc_lock);
 424
 425        return retval;
 426}
 427
 428/**
 429 * pdc_cache_info - Return cache and TLB information.
 430 * @cache_info: The return buffer.
 431 *
 432 * Returns information about the processor's cache and TLB.
 433 */
 434int pdc_cache_info(struct pdc_cache_info *cache_info)
 435{
 436        int retval;
 437
 438        spin_lock_irq(&pdc_lock);
 439        retval = mem_pdc_call(PDC_CACHE, PDC_CACHE_INFO, __pa(pdc_result), 0);
 440        convert_to_wide(pdc_result);
 441        memcpy(cache_info, pdc_result, sizeof(*cache_info));
 442        spin_unlock_irq(&pdc_lock);
 443
 444        return retval;
 445}
 446
 447#ifndef CONFIG_PA20
 448/**
 449 * pdc_btlb_info - Return block TLB information.
 450 * @btlb: The return buffer.
 451 *
 452 * Returns information about the hardware Block TLB.
 453 */
 454int pdc_btlb_info(struct pdc_btlb_info *btlb) 
 455{
 456        int retval;
 457
 458        spin_lock_irq(&pdc_lock);
 459        retval = mem_pdc_call(PDC_BLOCK_TLB, PDC_BTLB_INFO, __pa(pdc_result), 0);
 460        memcpy(btlb, pdc_result, sizeof(*btlb));
 461        spin_unlock_irq(&pdc_lock);
 462
 463        if(retval < 0) {
 464                btlb->max_size = 0;
 465        }
 466        return retval;
 467}
 468
 469/**
 470 * pdc_mem_map_hpa - Find fixed module information.  
 471 * @address: The return buffer
 472 * @mod_path: pointer to dev path structure.
 473 *
 474 * This call was developed for S700 workstations to allow the kernel to find
 475 * the I/O devices (Core I/O). In the future (Kittyhawk and beyond) this
 476 * call will be replaced (on workstations) by the architected PDC_SYSTEM_MAP
 477 * call.
 478 *
 479 * This call is supported by all existing S700 workstations (up to  Gecko).
 480 */
 481int pdc_mem_map_hpa(struct pdc_memory_map *address,
 482                struct pdc_module_path *mod_path)
 483{
 484        int retval;
 485
 486        spin_lock_irq(&pdc_lock);
 487        memcpy(pdc_result2, mod_path, sizeof(*mod_path));
 488        retval = mem_pdc_call(PDC_MEM_MAP, PDC_MEM_MAP_HPA, __pa(pdc_result),
 489                                __pa(pdc_result2));
 490        memcpy(address, pdc_result, sizeof(*address));
 491        spin_unlock_irq(&pdc_lock);
 492
 493        return retval;
 494}
 495#endif  /* !CONFIG_PA20 */
 496
 497/**
 498 * pdc_lan_station_id - Get the LAN address.
 499 * @lan_addr: The return buffer.
 500 * @hpa: The network device HPA.
 501 *
 502 * Get the LAN station address when it is not directly available from the LAN hardware.
 503 */
 504int pdc_lan_station_id(char *lan_addr, unsigned long hpa)
 505{
 506        int retval;
 507
 508        spin_lock_irq(&pdc_lock);
 509        retval = mem_pdc_call(PDC_LAN_STATION_ID, PDC_LAN_STATION_ID_READ,
 510                        __pa(pdc_result), hpa);
 511        if (retval < 0) {
 512                /* FIXME: else read MAC from NVRAM */
 513                memset(lan_addr, 0, PDC_LAN_STATION_ID_SIZE);
 514        } else {
 515                memcpy(lan_addr, pdc_result, PDC_LAN_STATION_ID_SIZE);
 516        }
 517        spin_unlock_irq(&pdc_lock);
 518
 519        return retval;
 520}
 521
 522
 523/**
 524 * pdc_get_initiator - Get the SCSI Interface Card params (SCSI ID, SDTR, SE or LVD)
 525 * @hwpath: fully bc.mod style path to the device.
 526 * @scsi_id: what someone told firmware the ID should be.
 527 * @period: time in cycles 
 528 * @width: 8 or 16-bit wide bus
 529 * @mode: 0,1,2 -> SE,HVD,LVD signalling mode
 530 *
 531 * Get the SCSI operational parameters from PDC.
 532 * Needed since HPUX never used BIOS or symbios card NVRAM.
 533 * Most ncr/sym cards won't have an entry and just use whatever
 534 * capabilities of the card are (eg Ultra, LVD). But there are
 535 * several cases where it's useful:
 536 *    o set SCSI id for Multi-initiator clusters,
 537 *    o cable too long (ie SE scsi 10Mhz won't support 6m length),
 538 *    o bus width exported is less than what the interface chip supports.
 539 */
 540int pdc_get_initiator( struct hardware_path *hwpath, unsigned char *scsi_id,
 541        unsigned long *period, char *width, char *mode)
 542{
 543        int retval;
 544
 545        spin_lock_irq(&pdc_lock);
 546
 547/* BCJ-XXXX series boxes. E.G. "9000/785/C3000" */
 548#define IS_SPROCKETS() (strlen(boot_cpu_data.pdc.sys_model_name) == 14 && \
 549        strncmp(boot_cpu_data.pdc.sys_model_name, "9000/785", 8) == 0)
 550
 551        retval = mem_pdc_call(PDC_INITIATOR, PDC_GET_INITIATOR, 
 552                              __pa(pdc_result), __pa(hwpath));
 553
 554        if (retval >= PDC_OK) {
 555                *scsi_id = (unsigned char) pdc_result[0];
 556
 557                /* convert Bus speed in Mhz to period (in 1/10 ns) */
 558                switch(pdc_result[1]) {
 559                /*
 560                ** case  0:   driver determines rate
 561                ** case -1:   Settings are uninitialized.
 562                */
 563                case  5:  *period = 2000; break;
 564                case 10:  *period = 1000; break;
 565                case 20:  *period = 500; break;
 566                case 40:  *period = 250; break;
 567                default: /* Do nothing */ break;
 568                }
 569
 570                /* 
 571                ** pdc_result[2]        PDC suggested SCSI id
 572                ** pdc_result[3]        PDC suggested SCSI rate
 573                */
 574
 575                /*
 576                ** XXX REVISIT: Doesn't look like PAT PDC does the same.
 577                ** Problem is A500 also exports 50-pin SE SCSI port.
 578                */
 579                if (IS_SPROCKETS()) {
 580                        /*
 581                        **      0 == 8-bit
 582                        **      1 == 16-bit
 583                        */
 584                        *width = (char) pdc_result[4];
 585
 586                        /* ...in case someone needs it in the future.
 587                        ** sym53c8xx.c comments say it can't autodetect
 588                        ** for 825/825A/875 chips.
 589                        **      0 == SE, 1 == HVD, 2 == LVD
 590                        */
 591                        *mode = (char) pdc_result[5]; 
 592                }
 593        }
 594
 595        spin_unlock_irq(&pdc_lock);
 596        return retval >= PDC_OK;
 597}
 598
 599
 600/**
 601 * pdc_pci_irt_size - Get the number of entries in the interrupt routing table.
 602 * @num_entries: The return value.
 603 * @hpa: The HPA for the device.
 604 *
 605 * This PDC function returns the number of entries in the specified cell's
 606 * interrupt table.
 607 * Similar to PDC_PAT stuff - but added for Forte/Allegro boxes
 608 */ 
 609int pdc_pci_irt_size(unsigned long *num_entries, unsigned long hpa)
 610{
 611        int retval;
 612
 613        spin_lock_irq(&pdc_lock);
 614        retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL_SIZE, 
 615                              __pa(pdc_result), hpa);
 616        convert_to_wide(pdc_result);
 617        *num_entries = pdc_result[0];
 618        spin_unlock_irq(&pdc_lock);
 619
 620        return retval;
 621}
 622
 623/** 
 624 * pdc_pci_irt - Get the PCI interrupt routing table.
 625 * @num_entries: The number of entries in the table.
 626 * @hpa: The Hard Physical Address of the device.
 627 * @tbl: 
 628 *
 629 * Get the PCI interrupt routing table for the device at the given HPA.
 630 * Similar to PDC_PAT stuff - but added for Forte/Allegro boxes
 631 */
 632int pdc_pci_irt(unsigned long num_entries, unsigned long hpa, void *tbl)
 633{
 634        int retval;
 635
 636        spin_lock_irq(&pdc_lock);
 637        pdc_result[0] = num_entries;
 638        retval = mem_pdc_call(PDC_PCI_INDEX, PDC_PCI_GET_INT_TBL, 
 639                              __pa(pdc_result), hpa, __pa(tbl));
 640        spin_unlock_irq(&pdc_lock);
 641
 642        return retval;
 643}
 644
 645
 646/**
 647 * pdc_tod_read - Read the Time-Of-Day clock.
 648 * @tod: The return buffer:
 649 *
 650 * Read the Time-Of-Day clock
 651 */
 652int pdc_tod_read(struct pdc_tod *tod)
 653{
 654        int retval;
 655
 656        spin_lock_irq(&pdc_lock);
 657        retval = mem_pdc_call(PDC_TOD, PDC_TOD_READ, __pa(pdc_result), 0);
 658        convert_to_wide(pdc_result);
 659        memcpy(tod, pdc_result, sizeof(*tod));
 660        spin_unlock_irq(&pdc_lock);
 661
 662        return retval;
 663}
 664
 665/**
 666 * pdc_tod_set - Set the Time-Of-Day clock.
 667 * @sec: The number of seconds since epoch.
 668 * @usec: The number of micro seconds.
 669 *
 670 * Set the Time-Of-Day clock.
 671 */ 
 672int pdc_tod_set(unsigned long sec, unsigned long usec)
 673{
 674        int retval;
 675
 676        spin_lock_irq(&pdc_lock);
 677        retval = mem_pdc_call(PDC_TOD, PDC_TOD_WRITE, sec, usec);
 678        spin_unlock_irq(&pdc_lock);
 679
 680        return retval;
 681}
 682
 683#ifdef __LP64__
 684int pdc_mem_mem_table(struct pdc_memory_table_raddr *r_addr,
 685                struct pdc_memory_table *tbl, unsigned long entries)
 686{
 687        int retval;
 688
 689        spin_lock_irq(&pdc_lock);
 690        retval = mem_pdc_call(PDC_MEM, PDC_MEM_TABLE, __pa(pdc_result), __pa(pdc_result2), entries);
 691        convert_to_wide(pdc_result);
 692        memcpy(r_addr, pdc_result, sizeof(*r_addr));
 693        memcpy(tbl, pdc_result2, entries * sizeof(*tbl));
 694        spin_unlock_irq(&pdc_lock);
 695
 696        return retval;
 697}
 698#endif /* __LP64__ */
 699
 700/* FIXME: Is this pdc used?  I could not find type reference to ftc_bitmap
 701 * so I guessed at unsigned long.  Someone who knows what this does, can fix
 702 * it later. :)
 703 */
 704int pdc_do_firm_test_reset(unsigned long ftc_bitmap)
 705{
 706        int retval;
 707
 708        spin_lock_irq(&pdc_lock);
 709        retval = mem_pdc_call(PDC_BROADCAST_RESET, PDC_DO_FIRM_TEST_RESET,
 710                              PDC_FIRM_TEST_MAGIC, ftc_bitmap);
 711        spin_unlock_irq(&pdc_lock);
 712
 713        return retval;
 714}
 715
 716/*
 717 * pdc_do_reset - Reset the system.
 718 *
 719 * Reset the system.
 720 */
 721int pdc_do_reset()
 722{
 723        int retval;
 724
 725        spin_lock_irq(&pdc_lock);
 726        retval = mem_pdc_call(PDC_BROADCAST_RESET, PDC_DO_RESET);
 727        spin_unlock_irq(&pdc_lock);
 728
 729        return retval;
 730}
 731
 732/*
 733 * pdc_soft_power_info - Enable soft power switch.
 734 * @power_reg: address of soft power register
 735 *
 736 * Return the absolute address of the soft power switch register
 737 */
 738int __init pdc_soft_power_info(unsigned long *power_reg)
 739{
 740        int retval;
 741
 742        *power_reg = (unsigned long) (-1);
 743        
 744        spin_lock_irq(&pdc_lock);
 745        retval = mem_pdc_call(PDC_SOFT_POWER, PDC_SOFT_POWER_INFO, __pa(pdc_result), 0);
 746        if (retval == PDC_OK) {
 747                convert_to_wide(pdc_result);
 748                *power_reg = f_extend(pdc_result[0]);
 749        }
 750        spin_unlock_irq(&pdc_lock);
 751
 752        return retval;
 753}
 754
 755/*
 756 * pdc_soft_power_button - Control the soft power button behaviour
 757 * @sw_control: 0 for hardware control, 1 for software control 
 758 *
 759 *
 760 * This PDC function places the soft power button under software or
 761 * hardware control.
 762 * Under software control the OS may control to when to allow to shut 
 763 * down the system. Under hardware control pressing the power button 
 764 * powers off the system immediately.
 765 */
 766int pdc_soft_power_button(int sw_control)
 767{
 768        int retval;
 769        spin_lock_irq(&pdc_lock);
 770        retval = mem_pdc_call(PDC_SOFT_POWER, PDC_SOFT_POWER_ENABLE, __pa(pdc_result), sw_control);
 771        spin_unlock_irq(&pdc_lock);
 772        return retval;
 773}
 774
 775/*
 776 * pdc_suspend_usb - Stop USB controller
 777 *
 778 * If PDC used the usb controller, the usb controller
 779 * is still running and will crash the machines during iommu 
 780 * setup, because of still running DMA. This PDC call
 781 * stops the USB controller
 782 */
 783void pdc_suspend_usb(void)
 784{
 785        spin_lock_irq(&pdc_lock);  
 786        mem_pdc_call(PDC_IO, PDC_IO_SUSPEND_USB, 0);
 787        spin_unlock_irq(&pdc_lock);
 788}
 789
 790/**
 791 * pdc_iodc_putc - Console character print using IODC.
 792 * @c: the character to output.
 793 *
 794 * Note that only these special chars are architected for console IODC io:
 795 * BEL, BS, CR, and LF. Others are passed through.
 796 * Since the HP console requires CR+LF to perform a 'newline', we translate
 797 * "\n" to "\r\n".
 798 */
 799void pdc_iodc_putc(unsigned char c)
 800{
 801        /* XXX Should we spinlock posx usage */
 802        static int posx;        /* for simple TAB-Simulation... */
 803        static int __attribute__((aligned(8)))   iodc_retbuf[32];
 804        static char __attribute__((aligned(64))) iodc_dbuf[4096];
 805        unsigned int n;
 806        unsigned int flags;
 807
 808        switch (c) {
 809        case '\n':
 810                iodc_dbuf[0] = '\r';
 811                iodc_dbuf[1] = '\n';
 812                n = 2;
 813                posx = 0;
 814                break;
 815        case '\t':
 816                pdc_iodc_putc(' ');
 817                while (posx & 7)        /* expand TAB */
 818                        pdc_iodc_putc(' ');
 819                return;         /* return since IODC can't handle this */
 820        case '\b':
 821                posx-=2;                /* BS */
 822        default:
 823                iodc_dbuf[0] = c;
 824                n = 1;
 825                posx++;
 826                break;
 827        }
 828
 829        spin_lock_irqsave(&pdc_lock, flags);
 830        real32_call(PAGE0->mem_cons.iodc_io,
 831                    (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
 832                    PAGE0->mem_cons.spa, __pa(PAGE0->mem_cons.dp.layers),
 833                    __pa(iodc_retbuf), 0, __pa(iodc_dbuf), n, 0);
 834        spin_unlock_irqrestore(&pdc_lock, flags);
 835}
 836
 837/**
 838 * pdc_iodc_outc - Console character print using IODC (without conversions).
 839 * @c: the character to output.
 840 *
 841 * Write the character directly to the IODC console.
 842 */
 843void pdc_iodc_outc(unsigned char c)
 844{
 845        unsigned int n, flags;
 846
 847        /* fill buffer with one caracter and print it */
 848        static int __attribute__((aligned(8)))   iodc_retbuf[32];
 849        static char __attribute__((aligned(64))) iodc_dbuf[4096];
 850
 851        n = 1;
 852        iodc_dbuf[0] = c;
 853
 854        spin_lock_irqsave(&pdc_lock, flags);
 855        real32_call(PAGE0->mem_cons.iodc_io,
 856                    (unsigned long)PAGE0->mem_cons.hpa, ENTRY_IO_COUT,
 857                    PAGE0->mem_cons.spa, __pa(PAGE0->mem_cons.dp.layers),
 858                    __pa(iodc_retbuf), 0, __pa(iodc_dbuf), n, 0);
 859        spin_unlock_irqrestore(&pdc_lock, flags);
 860}
 861
 862/**
 863 * pdc_iodc_getc - Read a character (non-blocking) from the PDC console.
 864 *
 865 * Read a character (non-blocking) from the PDC console, returns -1 if
 866 * key is not present.
 867 */
 868int pdc_iodc_getc(void)
 869{
 870        unsigned int flags;
 871        static int __attribute__((aligned(8)))   iodc_retbuf[32];
 872        static char __attribute__((aligned(64))) iodc_dbuf[4096];
 873        int ch;
 874        int status;
 875
 876        /* Bail if no console input device. */
 877        if (!PAGE0->mem_kbd.iodc_io)
 878                return 0;
 879        
 880        /* wait for a keyboard (rs232)-input */
 881        spin_lock_irqsave(&pdc_lock, flags);
 882        real32_call(PAGE0->mem_kbd.iodc_io,
 883                    (unsigned long)PAGE0->mem_kbd.hpa, ENTRY_IO_CIN,
 884                    PAGE0->mem_kbd.spa, __pa(PAGE0->mem_kbd.dp.layers), 
 885                    __pa(iodc_retbuf), 0, __pa(iodc_dbuf), 1, 0);
 886
 887        ch = *iodc_dbuf;
 888        status = *iodc_retbuf;
 889        spin_unlock_irqrestore(&pdc_lock, flags);
 890
 891        if (status == 0)
 892            return -1;
 893        
 894        return ch;
 895}
 896
 897int pdc_sti_call(unsigned long func, unsigned long flags,
 898                 unsigned long inptr, unsigned long outputr,
 899                 unsigned long glob_cfg)
 900{
 901        int retval;
 902
 903        spin_lock_irq(&pdc_lock);  
 904        retval = real32_call(func, flags, inptr, outputr, glob_cfg);
 905        spin_unlock_irq(&pdc_lock);
 906
 907        return retval;
 908}
 909
 910#ifdef __LP64__
 911/**
 912 * pdc_pat_cell_get_number - Returns the cell number.
 913 * @cell_info: The return buffer.
 914 *
 915 * This PDC call returns the cell number of the cell from which the call
 916 * is made.
 917 */
 918int pdc_pat_cell_get_number(struct pdc_pat_cell_num *cell_info)
 919{
 920        int retval;
 921
 922        spin_lock_irq(&pdc_lock);
 923        retval = mem_pdc_call(PDC_PAT_CELL, PDC_PAT_CELL_GET_NUMBER, __pa(pdc_result));
 924        memcpy(cell_info, pdc_result, sizeof(*cell_info));
 925        spin_unlock_irq(&pdc_lock);
 926
 927        return retval;
 928}
 929
 930/**
 931 * pdc_pat_cell_module - Retrieve the cell's module information.
 932 * @actcnt: The number of bytes written to mem_addr.
 933 * @ploc: The physical location.
 934 * @mod: The module index.
 935 * @view_type: The view of the address type.
 936 * @mem_addr: The return buffer.
 937 *
 938 * This PDC call returns information about each module attached to the cell
 939 * at the specified location.
 940 */
 941int pdc_pat_cell_module(unsigned long *actcnt, unsigned long ploc, unsigned long mod,
 942                        unsigned long view_type, void *mem_addr)
 943{
 944        int retval;
 945        static struct pdc_pat_cell_mod_maddr_block result __attribute__ ((aligned (8)));
 946
 947        spin_lock_irq(&pdc_lock);
 948        retval = mem_pdc_call(PDC_PAT_CELL, PDC_PAT_CELL_MODULE, __pa(pdc_result), 
 949                              ploc, mod, view_type, __pa(&result));
 950        if(!retval) {
 951                *actcnt = pdc_result[0];
 952                memcpy(mem_addr, &result, *actcnt);
 953        }
 954        spin_unlock_irq(&pdc_lock);
 955
 956        return retval;
 957}
 958
 959/**
 960 * pdc_pat_cpu_get_number - Retrieve the cpu number.
 961 * @cpu_info: The return buffer.
 962 * @hpa: The Hard Physical Address of the CPU.
 963 *
 964 * Retrieve the cpu number for the cpu at the specified HPA.
 965 */
 966int pdc_pat_cpu_get_number(struct pdc_pat_cpu_num *cpu_info, void *hpa)
 967{
 968        int retval;
 969
 970        spin_lock_irq(&pdc_lock);
 971        retval = mem_pdc_call(PDC_PAT_CPU, PDC_PAT_CPU_GET_NUMBER,
 972                              __pa(&pdc_result), hpa);
 973        memcpy(cpu_info, pdc_result, sizeof(*cpu_info));
 974        spin_unlock_irq(&pdc_lock);
 975
 976        return retval;
 977}
 978
 979/**
 980 * pdc_pat_get_irt_size - Retrieve the number of entries in the cell's interrupt table.
 981 * @num_entries: The return value.
 982 * @cell_num: The target cell.
 983 *
 984 * This PDC function returns the number of entries in the specified cell's
 985 * interrupt table.
 986 */
 987int pdc_pat_get_irt_size(unsigned long *num_entries, unsigned long cell_num)
 988{
 989        int retval;
 990
 991        spin_lock_irq(&pdc_lock);
 992        retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_GET_PCI_ROUTING_TABLE_SIZE,
 993                              __pa(pdc_result), cell_num);
 994        *num_entries = pdc_result[0];
 995        spin_unlock_irq(&pdc_lock);
 996
 997        return retval;
 998}
 999
1000/**
1001 * pdc_pat_get_irt - Retrieve the cell's interrupt table.
1002 * @r_addr: The return buffer.
1003 * @cell_num: The target cell.
1004 *
1005 * This PDC function returns the actual interrupt table for the specified cell.
1006 */
1007int pdc_pat_get_irt(void *r_addr, unsigned long cell_num)
1008{
1009        int retval;
1010
1011        spin_lock_irq(&pdc_lock);
1012        retval = mem_pdc_call(PDC_PAT_IO, PDC_PAT_IO_GET_PCI_ROUTING_TABLE,
1013                              __pa(r_addr), cell_num);
1014        spin_unlock_irq(&pdc_lock);
1015
1016        return retval;
1017}
1018
1019/**
1020 * pdc_pat_pd_get_addr_map - Retrieve information about memory address ranges.
1021 * @actlen: The return buffer.
1022 * @mem_addr: Pointer to the memory buffer.
1023 * @count: The number of bytes to read from the buffer.
1024 * @offset: The offset with respect to the beginning of the buffer.
1025 *
1026 */
1027int pdc_pat_pd_get_addr_map(unsigned long *actual_len, void *mem_addr, 
1028                            unsigned long count, unsigned long offset)
1029{
1030        int retval;
1031
1032        spin_lock_irq(&pdc_lock);
1033        retval = mem_pdc_call(PDC_PAT_PD, PDC_PAT_PD_GET_ADDR_MAP, __pa(pdc_result), 
1034                              __pa(pdc_result2), count, offset);
1035        *actual_len = pdc_result[0];
1036        memcpy(mem_addr, pdc_result2, *actual_len);
1037        spin_unlock_irq(&pdc_lock);
1038
1039        return retval;
1040}
1041#endif /* __LP64__ */
1042
1043
1044/***************** 32-bit real-mode calls ***********/
1045/* The struct below is used
1046 * to overlay real_stack (real2.S), preparing a 32-bit call frame.
1047 * real32_call_asm() then uses this stack in narrow real mode
1048 */
1049
1050struct narrow_stack {
1051        /* use int, not long which is 64 bits */
1052        unsigned int arg13;
1053        unsigned int arg12;
1054        unsigned int arg11;
1055        unsigned int arg10;
1056        unsigned int arg9;
1057        unsigned int arg8;
1058        unsigned int arg7;
1059        unsigned int arg6;
1060        unsigned int arg5;
1061        unsigned int arg4;
1062        unsigned int arg3;
1063        unsigned int arg2;
1064        unsigned int arg1;
1065        unsigned int arg0;
1066        unsigned int frame_marker[8];
1067        unsigned int sp;
1068        /* in reality, there's nearly 8k of stack after this */
1069};
1070
1071static long real32_call(unsigned long fn, ...)
1072{
1073        va_list args;
1074        extern struct narrow_stack real_stack;
1075        extern unsigned long real32_call_asm(unsigned int *,
1076                                             unsigned int *, 
1077                                             unsigned int);
1078        
1079        va_start(args, fn);
1080        real_stack.arg0 = va_arg(args, unsigned int);
1081        real_stack.arg1 = va_arg(args, unsigned int);
1082        real_stack.arg2 = va_arg(args, unsigned int);
1083        real_stack.arg3 = va_arg(args, unsigned int);
1084        real_stack.arg4 = va_arg(args, unsigned int);
1085        real_stack.arg5 = va_arg(args, unsigned int);
1086        real_stack.arg6 = va_arg(args, unsigned int);
1087        real_stack.arg7 = va_arg(args, unsigned int);
1088        real_stack.arg8 = va_arg(args, unsigned int);
1089        real_stack.arg9 = va_arg(args, unsigned int);
1090        real_stack.arg10 = va_arg(args, unsigned int);
1091        real_stack.arg11 = va_arg(args, unsigned int);
1092        real_stack.arg12 = va_arg(args, unsigned int);
1093        real_stack.arg13 = va_arg(args, unsigned int);
1094        va_end(args);
1095        
1096        return real32_call_asm(&real_stack.sp, &real_stack.arg0, fn);
1097}
1098
1099#ifdef __LP64__
1100/***************** 64-bit real-mode calls ***********/
1101
1102struct wide_stack {
1103        unsigned long arg0;
1104        unsigned long arg1;
1105        unsigned long arg2;
1106        unsigned long arg3;
1107        unsigned long arg4;
1108        unsigned long arg5;
1109        unsigned long arg6;
1110        unsigned long arg7;
1111        unsigned long arg8;
1112        unsigned long arg9;
1113        unsigned long arg10;
1114        unsigned long arg11;
1115        unsigned long arg12;
1116        unsigned long arg13;
1117        unsigned long frame_marker[2];  /* rp, previous sp */
1118        unsigned long sp;
1119        /* in reality, there's nearly 8k of stack after this */
1120};
1121
1122static long real64_call(unsigned long fn, ...)
1123{
1124        va_list args;
1125        extern struct wide_stack real_stack;
1126        extern unsigned long real64_call_asm(unsigned long *,
1127                                             unsigned long *, 
1128                                             unsigned long);
1129    
1130        va_start(args, fn);
1131        real_stack.arg0 = va_arg(args, unsigned long);
1132        real_stack.arg1 = va_arg(args, unsigned long);
1133        real_stack.arg2 = va_arg(args, unsigned long);
1134        real_stack.arg3 = va_arg(args, unsigned long);
1135        real_stack.arg4 = va_arg(args, unsigned long);
1136        real_stack.arg5 = va_arg(args, unsigned long);
1137        real_stack.arg6 = va_arg(args, unsigned long);
1138        real_stack.arg7 = va_arg(args, unsigned long);
1139        real_stack.arg8 = va_arg(args, unsigned long);
1140        real_stack.arg9 = va_arg(args, unsigned long);
1141        real_stack.arg10 = va_arg(args, unsigned long);
1142        real_stack.arg11 = va_arg(args, unsigned long);
1143        real_stack.arg12 = va_arg(args, unsigned long);
1144        real_stack.arg13 = va_arg(args, unsigned long);
1145        va_end(args);
1146        
1147        return real64_call_asm(&real_stack.sp, &real_stack.arg0, fn);
1148}
1149
1150#endif /* __LP64__ */
1151
1152
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.