/*! This is the common accelerant_info initializer. It is called by both, the first accelerant and all clones. */ static status_t init_common(int device, bool isClone) { // initialize global accelerant info structure gInfo = (accelerant_info *)malloc(sizeof(accelerant_info)); if (gInfo == NULL) return B_NO_MEMORY; memset(gInfo, 0, sizeof(accelerant_info)); gInfo->is_clone = isClone; gInfo->device = device; gInfo->current_mode = UINT16_MAX; // get basic info from driver area_id sharedArea; if (ioctl(device, VESA_GET_PRIVATE_DATA, &sharedArea, sizeof(area_id)) != 0) { free(gInfo); return B_ERROR; } AreaCloner sharedCloner; gInfo->shared_info_area = sharedCloner.Clone("vesa shared info", (void **)&gInfo->shared_info, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, sharedArea); status_t status = sharedCloner.InitCheck(); if (status < B_OK) { free(gInfo); return status; } if (gInfo->shared_info->vesa_mode_count == 0) gInfo->vesa_modes = NULL; else gInfo->vesa_modes = (vesa_mode *)((uint8 *)gInfo->shared_info + gInfo->shared_info->vesa_mode_offset); sharedCloner.Keep(); return B_OK; }
/*! This is the common accelerant_info initializer. It is called by both, the first accelerant and all clones. */ static status_t init_common(int device, bool isClone) { // initialize global accelerant info structure gInfo = (accelerant_info*)malloc(sizeof(accelerant_info)); if (gInfo == NULL) return B_NO_MEMORY; memset(gInfo, 0, sizeof(accelerant_info)); // malloc memory for active display information for (uint32 id = 0; id < MAX_DISPLAY; id++) { gDisplay[id] = (display_info*)malloc(sizeof(display_info)); if (gDisplay[id] == NULL) return B_NO_MEMORY; memset(gDisplay[id], 0, sizeof(display_info)); gDisplay[id]->regs = (register_info*)malloc(sizeof(register_info)); if (gDisplay[id]->regs == NULL) return B_NO_MEMORY; memset(gDisplay[id]->regs, 0, sizeof(register_info)); } // malloc for possible physical card connectors for (uint32 id = 0; id < ATOM_MAX_SUPPORTED_DEVICE; id++) { gConnector[id] = (connector_info*)malloc(sizeof(connector_info)); if (gConnector[id] == NULL) return B_NO_MEMORY; memset(gConnector[id], 0, sizeof(connector_info)); } // malloc for card gpio pin information for (uint32 id = 0; id < ATOM_MAX_SUPPORTED_DEVICE; id++) { gGPIOInfo[id] = (gpio_info*)malloc(sizeof(gpio_info)); if (gGPIOInfo[id] == NULL) return B_NO_MEMORY; memset(gGPIOInfo[id], 0, sizeof(gpio_info)); } gInfo->is_clone = isClone; gInfo->device = device; gInfo->dpms_mode = B_DPMS_ON; // initial state // get basic info from driver radeon_get_private_data data; data.magic = RADEON_PRIVATE_DATA_MAGIC; if (ioctl(device, RADEON_GET_PRIVATE_DATA, &data, sizeof(radeon_get_private_data)) != 0) { free(gInfo); return B_ERROR; } AreaCloner sharedCloner; gInfo->shared_info_area = sharedCloner.Clone("radeon hd shared info", (void**)&gInfo->shared_info, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, data.shared_info_area); status_t status = sharedCloner.InitCheck(); if (status < B_OK) { free(gInfo); TRACE("%s, failed to create shared area\n", __func__); return status; } AreaCloner regsCloner; gInfo->regs_area = regsCloner.Clone("radeon hd regs", (void**)&gInfo->regs, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, gInfo->shared_info->registers_area); status = regsCloner.InitCheck(); if (status < B_OK) { free(gInfo); TRACE("%s, failed to create mmio area\n", __func__); return status; } gInfo->rom_area = clone_area("radeon hd AtomBIOS", (void**)&gInfo->rom, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, gInfo->shared_info->rom_area); if (gInfo->rom_area < 0) { TRACE("%s: Clone of AtomBIOS failed!\n", __func__); gInfo->shared_info->has_rom = false; } if (gInfo->rom[0] != 0x55 || gInfo->rom[1] != 0xAA) TRACE("%s: didn't find a VGA bios in cloned region!\n", __func__); sharedCloner.Keep(); regsCloner.Keep(); return B_OK; }
/*! This is the common accelerant_info initializer. It is called by both, the first accelerant and all clones. */ static status_t init_common(int device, bool isClone) { // initialize global accelerant info structure // Number of register dumps we have... taken. gDumpCount = 0; gInfo = (accelerant_info*)malloc(sizeof(accelerant_info)); if (gInfo == NULL) return B_NO_MEMORY; memset(gInfo, 0, sizeof(accelerant_info)); gInfo->is_clone = isClone; gInfo->device = device; // get basic info from driver intel_get_private_data data; data.magic = INTEL_PRIVATE_DATA_MAGIC; if (ioctl(device, INTEL_GET_PRIVATE_DATA, &data, sizeof(intel_get_private_data)) != 0) { free(gInfo); return B_ERROR; } AreaCloner sharedCloner; gInfo->shared_info_area = sharedCloner.Clone("intel extreme shared info", (void**)&gInfo->shared_info, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, data.shared_info_area); status_t status = sharedCloner.InitCheck(); if (status < B_OK) { free(gInfo); return status; } AreaCloner regsCloner; gInfo->regs_area = regsCloner.Clone("intel extreme regs", (void**)&gInfo->registers, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, gInfo->shared_info->registers_area); status = regsCloner.InitCheck(); if (status < B_OK) { free(gInfo); return status; } sharedCloner.Keep(); regsCloner.Keep(); // The overlay registers, hardware status, and cursor memory share // a single area with the shared_info if (gInfo->shared_info->overlay_offset != 0) { gInfo->overlay_registers = (struct overlay_registers*) (gInfo->shared_info->graphics_memory + gInfo->shared_info->overlay_offset); } if (gInfo->shared_info->device_type.InGroup(INTEL_GROUP_96x)) { // allocate some extra memory for the 3D context if (intel_allocate_memory(INTEL_i965_3D_CONTEXT_SIZE, B_APERTURE_NON_RESERVED, gInfo->context_base) == B_OK) { gInfo->context_offset = gInfo->context_base - (addr_t)gInfo->shared_info->graphics_memory; } } gInfo->pipe_count = 0; // Allocate all of our pipes for (int i = 0; i < MAX_PIPES; i++) { switch (i) { case 0: gInfo->pipes[i] = new(std::nothrow) Pipe(INTEL_PIPE_A); break; case 1: gInfo->pipes[i] = new(std::nothrow) Pipe(INTEL_PIPE_B); break; default: ERROR("%s: Unknown pipe %d\n", __func__, i); } if (gInfo->pipes[i] == NULL) ERROR("%s: Error allocating pipe %d\n", __func__, i); else gInfo->pipe_count++; } return B_OK; }
/*! This is the common accelerant_info initializer. It is called by both, the first accelerant and all clones. */ static status_t init_common(int device, bool isClone) { // initialize global accelerant info structure gInfo = (accelerant_info*)malloc(sizeof(accelerant_info)); if (gInfo == NULL) return B_NO_MEMORY; memset(gInfo, 0, sizeof(accelerant_info)); gInfo->is_clone = isClone; gInfo->device = device; // get basic info from driver intel_get_private_data data; data.magic = INTEL_PRIVATE_DATA_MAGIC; if (ioctl(device, INTEL_GET_PRIVATE_DATA, &data, sizeof(intel_get_private_data)) != 0) { free(gInfo); return B_ERROR; } AreaCloner sharedCloner; gInfo->shared_info_area = sharedCloner.Clone("intel extreme shared info", (void**)&gInfo->shared_info, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, data.shared_info_area); status_t status = sharedCloner.InitCheck(); if (status < B_OK) { free(gInfo); return status; } AreaCloner regsCloner; gInfo->regs_area = regsCloner.Clone("intel extreme regs", (void**)&gInfo->registers, B_ANY_ADDRESS, B_READ_AREA | B_WRITE_AREA, gInfo->shared_info->registers_area); status = regsCloner.InitCheck(); if (status < B_OK) { free(gInfo); return status; } sharedCloner.Keep(); regsCloner.Keep(); // The overlay registers, hardware status, and cursor memory share // a single area with the shared_info gInfo->overlay_registers = (struct overlay_registers*) (gInfo->shared_info->graphics_memory + gInfo->shared_info->overlay_offset); if (gInfo->shared_info->device_type.InGroup(INTEL_TYPE_96x)) { // allocate some extra memory for the 3D context if (intel_allocate_memory(INTEL_i965_3D_CONTEXT_SIZE, B_APERTURE_NON_RESERVED, gInfo->context_base) == B_OK) { gInfo->context_offset = gInfo->context_base - (addr_t)gInfo->shared_info->graphics_memory; } } return B_OK; }