162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2023 Loongson Technology Corporation Limited
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/pci.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include "lsdc_drv.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistatic const struct lsdc_kms_funcs ls7a1000_kms_funcs = {
1162306a36Sopenharmony_ci	.create_i2c = lsdc_create_i2c_chan,
1262306a36Sopenharmony_ci	.irq_handler = ls7a1000_dc_irq_handler,
1362306a36Sopenharmony_ci	.output_init = ls7a1000_output_init,
1462306a36Sopenharmony_ci	.cursor_plane_init = ls7a1000_cursor_plane_init,
1562306a36Sopenharmony_ci	.primary_plane_init = lsdc_primary_plane_init,
1662306a36Sopenharmony_ci	.crtc_init = ls7a1000_crtc_init,
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic const struct lsdc_kms_funcs ls7a2000_kms_funcs = {
2062306a36Sopenharmony_ci	.create_i2c = lsdc_create_i2c_chan,
2162306a36Sopenharmony_ci	.irq_handler = ls7a2000_dc_irq_handler,
2262306a36Sopenharmony_ci	.output_init = ls7a2000_output_init,
2362306a36Sopenharmony_ci	.cursor_plane_init = ls7a2000_cursor_plane_init,
2462306a36Sopenharmony_ci	.primary_plane_init = lsdc_primary_plane_init,
2562306a36Sopenharmony_ci	.crtc_init = ls7a2000_crtc_init,
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic const struct loongson_gfx_desc ls7a1000_gfx = {
2962306a36Sopenharmony_ci	.dc = {
3062306a36Sopenharmony_ci		.num_of_crtc = 2,
3162306a36Sopenharmony_ci		.max_pixel_clk = 200000,
3262306a36Sopenharmony_ci		.max_width = 2048,
3362306a36Sopenharmony_ci		.max_height = 2048,
3462306a36Sopenharmony_ci		.num_of_hw_cursor = 1,
3562306a36Sopenharmony_ci		.hw_cursor_w = 32,
3662306a36Sopenharmony_ci		.hw_cursor_h = 32,
3762306a36Sopenharmony_ci		.pitch_align = 256,
3862306a36Sopenharmony_ci		.has_vblank_counter = false,
3962306a36Sopenharmony_ci		.funcs = &ls7a1000_kms_funcs,
4062306a36Sopenharmony_ci	},
4162306a36Sopenharmony_ci	.conf_reg_base = LS7A1000_CONF_REG_BASE,
4262306a36Sopenharmony_ci	.gfxpll = {
4362306a36Sopenharmony_ci		.reg_offset = LS7A1000_PLL_GFX_REG,
4462306a36Sopenharmony_ci		.reg_size = 8,
4562306a36Sopenharmony_ci	},
4662306a36Sopenharmony_ci	.pixpll = {
4762306a36Sopenharmony_ci		[0] = {
4862306a36Sopenharmony_ci			.reg_offset = LS7A1000_PIXPLL0_REG,
4962306a36Sopenharmony_ci			.reg_size = 8,
5062306a36Sopenharmony_ci		},
5162306a36Sopenharmony_ci		[1] = {
5262306a36Sopenharmony_ci			.reg_offset = LS7A1000_PIXPLL1_REG,
5362306a36Sopenharmony_ci			.reg_size = 8,
5462306a36Sopenharmony_ci		},
5562306a36Sopenharmony_ci	},
5662306a36Sopenharmony_ci	.chip_id = CHIP_LS7A1000,
5762306a36Sopenharmony_ci	.model = "LS7A1000 bridge chipset",
5862306a36Sopenharmony_ci};
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistatic const struct loongson_gfx_desc ls7a2000_gfx = {
6162306a36Sopenharmony_ci	.dc = {
6262306a36Sopenharmony_ci		.num_of_crtc = 2,
6362306a36Sopenharmony_ci		.max_pixel_clk = 350000,
6462306a36Sopenharmony_ci		.max_width = 4096,
6562306a36Sopenharmony_ci		.max_height = 4096,
6662306a36Sopenharmony_ci		.num_of_hw_cursor = 2,
6762306a36Sopenharmony_ci		.hw_cursor_w = 64,
6862306a36Sopenharmony_ci		.hw_cursor_h = 64,
6962306a36Sopenharmony_ci		.pitch_align = 64,
7062306a36Sopenharmony_ci		.has_vblank_counter = true,
7162306a36Sopenharmony_ci		.funcs = &ls7a2000_kms_funcs,
7262306a36Sopenharmony_ci	},
7362306a36Sopenharmony_ci	.conf_reg_base = LS7A2000_CONF_REG_BASE,
7462306a36Sopenharmony_ci	.gfxpll = {
7562306a36Sopenharmony_ci		.reg_offset = LS7A2000_PLL_GFX_REG,
7662306a36Sopenharmony_ci		.reg_size = 8,
7762306a36Sopenharmony_ci	},
7862306a36Sopenharmony_ci	.pixpll = {
7962306a36Sopenharmony_ci		[0] = {
8062306a36Sopenharmony_ci			.reg_offset = LS7A2000_PIXPLL0_REG,
8162306a36Sopenharmony_ci			.reg_size = 8,
8262306a36Sopenharmony_ci		},
8362306a36Sopenharmony_ci		[1] = {
8462306a36Sopenharmony_ci			.reg_offset = LS7A2000_PIXPLL1_REG,
8562306a36Sopenharmony_ci			.reg_size = 8,
8662306a36Sopenharmony_ci		},
8762306a36Sopenharmony_ci	},
8862306a36Sopenharmony_ci	.chip_id = CHIP_LS7A2000,
8962306a36Sopenharmony_ci	.model = "LS7A2000 bridge chipset",
9062306a36Sopenharmony_ci};
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cistatic const struct lsdc_desc *__chip_id_desc_table[] = {
9362306a36Sopenharmony_ci	[CHIP_LS7A1000] = &ls7a1000_gfx.dc,
9462306a36Sopenharmony_ci	[CHIP_LS7A2000] = &ls7a2000_gfx.dc,
9562306a36Sopenharmony_ci	[CHIP_LS_LAST] = NULL,
9662306a36Sopenharmony_ci};
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ciconst struct lsdc_desc *
9962306a36Sopenharmony_cilsdc_device_probe(struct pci_dev *pdev, enum loongson_chip_id chip_id)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	return __chip_id_desc_table[chip_id];
10262306a36Sopenharmony_ci}
103